首页 » Web前端 » 图片注入php技巧_一张图片也能SQL注入

图片注入php技巧_一张图片也能SQL注入

访客 2024-12-05 0

扫一扫用手机浏览

文章目录 [+]

声明:笔者初衷用于分享与遍及网络知识,若读者因此作出任何危害网络安全行为后果自大,与合天网安实验室及原作者无关,本文为合天网安实验室原创,如需转载,请注明出处!

序言

最近在复盘SQL注入,看到有一个trick挺故意思的,这个trick紧张利用后端程序会将文件exif信息插入数据库进行SQL注入

图片注入php技巧_一张图片也能SQL注入

因此本篇文章会从题目解题,源码剖析,底层调试这几个方面入手,如有疏忽,请多包涵。

图片注入php技巧_一张图片也能SQL注入
(图片来自网络侵删)
什么是exif?

为了方便后面文章先容这个trick,首先我们须要理解什么是exif?

实在exif是可交流图像文件的缩写,是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。

例如生活中利用手机相机或者数码相机拍照的时候,exif会记录拍照时的一些属性,例如:光圈,焦距,拍照韶光,拍照设备等等属性

题目解题

题目地址:你没见过的注入

题目地址获取:后台回答“注入”

首先打开题目,前面一些与本文无关的解题步骤就不赘述了,简要的概括一下便是:扫目录扫到robots.txt,进入修正密码页面,修正完成密码之后进入后台。

后台还是比较大略的,便是一个上传的页面

选择文件进行上传即可,并且进行测试后创造,上传的文件都没有被过滤,纵然是上传同一个文件,文件名也是不一样的,因此预测这里利用了随机数md5的办法进行文件命名

这一题文件名被随机数md5重命名,并且,以是文件名不是注入点,但是剖析一下上方的列目录的文件,首先肯定是有数据库存储干系文件信息(上图中的filetype),因此查询一下PHP有哪些函数或者方法会有这样的功能,查询PHP官方手册后可以创造,个中finfo工具以及finfo_file函数是有这个功能的

因此就可以大胆预测在filetype会存在SQL注入,并且SQL语句该当是insert开头的插入语句

那么如何掌握这个filetype呢?

我们可以利用file命令查看一个文件的信息,如下图所示

这一个命令一出是不是就创造和上面那个页面的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命令查看文件信息

可以看到,命令已经成功注入到了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."');";上方代码第一行便是前面说的,将随机数md5存储文件第二行这里利用到了finfo::file,这里便是我们的注入点第三行是目录的拼接第四行便是存在SQL注入的SQL语句

if(mysqli_num_rows($result)>0){ while($row=mysqli_fetch_assoc($result)){ echo "<li>"; echo "filename:<a href='".$row["filepath"]."'>".$row["filename"]."</a> filetype:".$row["filetype"]."<br>"; } echo "</li>";}

这一段代码就比较大略,便是将存储的文件名列出来

那么造成注入的罪魁罪魁便是这一行代码:

$filetype = (new finfo)->file($_FILES['file']['tmp_name']);

这里利用finfo::file方法,这个方法在PHP手册先容如下,但是并不是很详细,后半部分将会对这一个函数进行底层代码跟踪剖析。

finfo::file底层跟进

finfo::file方法在ext/fileinfo/fileinfo.c中

个中finfo中有这么几个方法:

class finfo{ / @alias finfo_open / public function __construct(int $flags = FILEINFO_NONE, ?string $magic_database = null) {} / @param resource|null $context @return string|false @alias finfo_file / public function file(string $filename, int $flags = FILEINFO_NONE, $context = null) {} / @param resource|null $context @return string|false @alias finfo_buffer / public function buffer(string $string, int $flags = FILEINFO_NONE, $context = null) {} / @return bool @alias finfo_set_flags / public function set_flags(int $flags) {}}

我们跟进finfo::file

我们不才方图中位置下三个断点

将前面题目拉下来的源文件放在一个文件夹中进行调试

源文件如下:

将upload.php修正如下

$filename = md5(md5(rand(1,10000))).".zip";$filetype = (new finfo)->file($_FILES['file']['tmp_name']);$filepath = "upload/".$filename;var_dump($filetype);die(0);

开启调试,上传注入文件后程序便会停滞在断点处

第一个断点处,421行,这个断点处调用包装器打开资源并返回流工具

第二个断点处,431-432行,进入magic_stream,单步调试,监视ms以及ret_val

进入file_or_stream

直接看file_or_stream的return

跟进file_getbuffer,下方实在就可以看到ms->o.buf已经获取到了exif信息

后面的就不连续跟进了,但是可以肯定的是file()方法可以检测图片的EXIF信息,并且作为题目中的filetype传入数据库造成注入

$filetype = (new finfo)->file($_FILES['file']['tmp_name']);总结

虽然是几年前的trick,但是每弄清楚一个trick,攻击面就会更广。

参考文章CTFshow 36D Web Writeup – 颖奇L'Amore (gem-love.com)PHP回顾之流 - SegmentFault 思否
标签:

相关文章

php新的特征技巧_PHP 7 新特点

PHP 7 中的函数的形参类型声明可以是标量了。在 PHP 5 中只能是类名、接口、array 或者 callable (PHP...

Web前端 2024-12-07 阅读0 评论0

有道翻译apiphp技巧_翻译接口整理

由于个人须要将中文翻译成英文,以是开始对翻译接口有了兴趣!于是整理下常用的五个翻译接口包括谷歌、百度、有道、必应、金山词霸,经由研...

Web前端 2024-12-07 阅读0 评论0