目录
1 概述
1.1 目的
为了保障安全性,服务器还需要对文件内容进行检测。
1.2 检测方法
- 对于图片文件,PHP中有一个函数getimagesize(),这个函数本身检测图片大小,但是在检测之前还会判断目标文件是否是一张图片,因此,可以使用该函数来检测文件内容是否输出图片类型。
- 由于同一类型文件的头部内容也是一样的,服务器也常根据文件的头部内容进行判断。
2 图片马的制作方法
目的:让服务器对文件内容进行检测时,将文件判断为图片。
2.1 方法一:直接编辑
新建文件并命名为info.gif,文件内容如下。该文件在函数getimagesize()检测时,会被识别为gif图片,但是该文件无法直接在服务器端执行里面的代码,需要借助其他漏洞才能执行。
GIF89a
<?php
phpinfo();
?>
2.2 方法二:合并文件
- 准备一张图片,例如此处文件名为fighting_hawk.png。
- 准备一个php一句话木马文件,比如此处文件名为
info.php
,内容为<?php phpinfo(); ?>
。 - 合并文件。在windows系统下,运行cmd,输入命令
copy fighting_hawk.png/b+info.php/a muma.jpg
。需要注意的是需要先cd到两个文件所在的路径下执行命令。
- 以记事本方式打开生成的文件,可以看到里面包含着php代码语句。
2.3 方法三:利用十六进制编辑器
- 需要了解的是,各种图片的文件头部都是相同的,比如说所有的jpg图片的头部文件是一致的;不同格式的图片之间的头部文件是不同的。
- 函数getimagesize()无法识别文件幻术生成的文件。
- 常见的图片文件类型如下:
文件格式 | 头部 |
---|---|
.gif | 47 49 46 38 39 61 F1 00 2C 01 F7 00 00 64 32 33 |
.jpg | FF D8 FF E0 00 10 4A 46 69 46 00 01 01 01 01 2C |
.png | 89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 |
- 新建文件,命名为16.png,文件内容如下,需要在16进制编辑器中将第一行转换为ASCII码。
89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52
<?php phpinfo(); ?>
3 实验简介
3.1 实验目的
掌握绕过内容检测的方法,验证文件上传漏洞的存在。
3.2 实验环境
- 靶场:基于WAMP环境的upload-labs靶场,搭建过程可参考文章《基于WAMP环境的upload-labs漏洞测试平台搭建过程》。
- 攻击机:安装BurpSuite软件。
3.3 实验前准备
- 准备好一个图片马,该文件可能是木马,也可能是其他任意文件,本实验以php探针作为测试文件,来验证是否存在文件上传漏洞以及绕过漏洞检测的方法。
- 使用上面方法一生成的文件进行测试,文件名为:
info.gif
。
4 实验过程
- 测试顺序:前端JS→MIME类型→文件后缀→文件内容。因为这个还要修改文件内容,相关工作量较大。
- 选择准备好的图片马进行上传。
- 可以看到该文件直接上传成功,由于文件具体内容并非图片,因此此处无法正常显示图片内容。
- 需要配合以后学习的文件包含漏洞、服务器解析漏洞等,才能让该文件成功执行。现在先直接在服务器找打上传的图片马,以记事本打开,可以看到里面的恶意代码并没有被删除,说明文件成功上传。
- 结论:虽然服务器端无法运行文件中的代码(要执行需要配合服务器解析漏洞、文件包含漏洞等其他漏洞去实现,比如将该文件另存为php格式的文件等等),但是渗透测试报告中仍应记录该情况,存在任意文件上传漏洞。
5 总结
- 了解文件头部内容以及服务器检验文件内容与类型的方法;
- 掌握图片马的制作方法;
- 掌握绕过服务器端内容检测的方法。