一张图片也能SQL注入?

作者:Lxxx
声明:笔者初衷用于分享与普及网络知识,若读者因此作出任何危害网络安全行为后果自负,与合天网安实验室及原作者无关,本文为合天网安实验室原创,如需转载,请注明出处!
前言最近在复盘SQL注入,看到有一个trick挺有意思的,这个trick主要利用后端程序会将文件exif信息插入数据库进行SQL注入
因此本篇文章会从题目解题,源码分析,底层调试这几个方面入手,如有纰漏,请多包涵 。
什么是exif?为了方便后面文章介绍这个trick,首先我们需要了解什么是exif?
其实exif是可交换图像文件的缩写,是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据 。
例如生活中利用手机相机或者数码相机拍照的时候,exif会记录拍照时的一些属性,例如:光圈,焦距,拍照时间,拍照设备等等属性
题目解题题目地址:你没见过的注入
题目地址获取:后台回复“注入”
首先打开题目,前面一些与本文无关的解题步骤就不赘述了,简要的概括一下就是:扫目录扫到robots.txt,进入修改密码页面,修改完成密码之后进入后台 。
后台还是比较简单的,就是一个上传的页面

一张图片也能SQL注入?

文章插图
 
选择文件进行上传即可,并且进行测试后发现,上传的文件都没有被过滤,即使是上传同一个文件,文件名也是不一样的,因此猜测这里使用了随机数md5的方式进行文件命名
一张图片也能SQL注入?

文章插图
 
这一题文件名被随机数md5重命名,并且,所以文件名不是注入点,但是分析一下上方的列目录的文件,首先肯定是有数据库存储相关文件信息(上图中的filetype),因此查询一下php有哪些函数或者方法会有这样的功能,查询PHP官方手册后可以发现,其中finfo对象以及finfo_file函数是有这个功能的
一张图片也能SQL注入?

文章插图
 
因此就可以大胆猜测在filetype会存在SQL注入,并且SQL语句应该是insert开头的插入语句
那么如何控制这个filetype呢?
我们可以使用file命令查看一个文件的信息,如下图所示
一张图片也能SQL注入?

文章插图
 
这一个命令一出是不是就发现和上面那个页面的filetype十分相似了呢?
那么是否有工具可以控制这个filetype呢?有的,那就是exiftool
安装完成后,我们尝试在一个图片里加入SQL语句,这里我们假设题目的SQL语句如下(这个很需要经验,不过这里我就直接给出来了,做题的时候还是需要慢慢fuzz)
insert into columns('字段1','字段2','字段3') value('值1','值2','值3')因此注入语句
123"';select if(1,sleep(5),sleep(5));--+具体的exiftool的命令为
exiftool -overwrite_original -comment="123"');select if(1,sleep(5),sleep(5));--+" avatar.jpg利用exiftool添加comment之后,使用file命令查看文件信息
一张图片也能SQL注入?

文章插图
 
可以看到,命令已经成功注入到了comment中,上传该图片,就可以发现明显有延迟,所以命令注入成功 。
之后拿flag就很简单了,利用into outfile写入一句话木马即可,这里就不赘述了 。
那么,究竟是什么函数会导致这样的SQL注入呢?
抱着深究的心态把题目源代码拷贝下来进行分析(所有可以getshell的题目都可以把题目拿下来进行分析,可以学到更多的东西)
题目源代码分析首先一些登录文件就不看了,直接看最重要的,会造成SQL注入的那几个文件(为了防止篇幅过长,我这里仅将关键代码进行展示)
$filename = md5(md5(rand(1,10000))).".zip";$filetype = (new finfo)->file($_FILES['file']['tmp_name']);$filepath = "upload/".$filename;$sql = "INSERT INTO file(filename,filepath,filetype) VALUES ('".$filename."','".$filepath."','".$filetype."');";