文件内容检查包括:
- content-type检查
- 文件头检查
- getimagesize()检查
- php_exif模块检查
- imagecreatefromjpeg二次渲染
测试流程:(前提是已经拿到一个上传点)
- 上传一张正常的照片,验证上传功能是否正常(照片可以用.jpg或者.php等格式进行尝试上传)
- 最好直接上传一张图片一句话马,它可以绕过content-type,文件头,getimagesize(),php_exif检查,进而成功上传
- 针对二次渲染,寻找图片数据中不会被转换的部分,将代码插入其中(这种情况就是在你已经将含有php代码的文件成功上传了,并且文件连接也是成功的,但是无法实施执行操作,这就意味着网站可能对我们上传的文件进行了二次渲染)
content-type检查:
就是上传点会对你上传的图片的content-type值进行检查
绕过方法:
使用burp suite抓包直接修改content-type值,比如将.php格式的content-type:application/x-php 改为.jpg格式的content-type:image/jpeg
文件头检查:
将一个正常的图片放进C32Asm里并选择16进制模式,会显示,这就是上传点对文件头检查要检查的东西
绕过方法:
在文件头部添加gif89a(要注意的是,这样做确实可以成功绕过,但是他也会导致我们上传的文件变成.gif格式,进而导致php一句话木马无法起作用,但我们可以让它与其他漏洞结合来操作,比如结合文件包含漏洞)
gif89a <?php phpinfo(); ?>
图片一句话
结合文件包含漏洞或者解析漏洞
getimagesize()检查和php_exif模块检查:
getimagesize()函数:
示例:
<?php $remote_png_url = 'http://www.runoob.com/wp-content/themes/w3cschool.cc/assets/img/logodomain-green2.png'; $img_data = getimagesize($remote_png_url); print_r($img_data ); ?>
输出:
Array ( [0] => 290 [1] => 69 [2] => 3 [3] => width="290" height="69" [bits] => 8 [mime] => image/png )
注释:
- 索引 0 给出的是图像宽度的像素值
- 索引 1 给出的是图像⾼度的像素值
- 索引 2 给出的是图像的类型,返回的是数字,其中1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF(intel byte order),8 = TIFF(motorola byte order),9 = JPC,10 = JP2,11 = JPX,12 = JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM
- 索引 3 给出的是⼀个宽度和⾼度的字符串,可以直接⽤于 HTML 的 <image>标签
- 索引 bits 给出的是图像的每种颜⾊的位数,⼆进制格式
- 索引 channels 给出的是图像的通道值,RGB 图像默认是 3
- 索引 mime 给出的是图像的 MIME 信息,此信息可以⽤来在 HTTP Content-type 头信息中发送正确的信息,如: header("Content-type: image/jpeg");
绕过方法:
在文件头部添加gif89a
图片一句话,结合解析漏洞或文件包含漏洞
imagecreatfromjpeg二次渲染:
⼆次渲染:就是根据⽤户上传的图⽚,新⽣成⼀个图⽚,将原始图⽚删除,将新图⽚添加到数据库中。⽐如⼀些⽹ 站根据⽤户上传的头像⽣成⼤中⼩不同尺⼨的图像。
绕过方法:
寻找渲染前后不变的地⽅(可以在c32里进行比对),替换成⼀句话