本地验证
JS禁用、Burp改包、本地提交
后缀黑名单验证
大小写、加空格、符号点(系统特性)、::$DATA(Windows平台)
过滤不迭代问题
例如,".php. .“方法:这针对的是在过滤中,代码中去掉末尾的点,再首位去空,再进行后缀过滤点情形。
后缀白名单验证
MIME(使用FILETYPE而不是后缀验证)
后缀白名单验证
MIME、%00、0x00截断
- 其中,MIME主要修改Content-Type项;
- %00和0x00主要影响某些版本的PHP(
CVE-2015-2348
,PHP 5.4.38~5.6.6)。在文件名中插入,比方说x.php%00.jpg
,并且URL-Decode后(URL中不用转换),作为文件名,即可截断后缀。 ⚠️这里注意区分,GET请求对%00进行编码,POST不对%00编码。%00
自动编码后将变成%25%30%30
,而这不是我们需要的。
图片后门
单纯文件头验证不安全,需要配合后缀检测。
过滤<?怎么办?
使用多种php标记方法,如
<script language="php">
eval($_POST['xd']);
</script>
二次渲染
上传的图片被修改后显示出来(尺寸或格式)。例如:
copy shell.jpg/b + shell.php/a s.jpg
将图片与后门合并后上传,若存在二次渲染,则后门可能失效。此时,应该对比上传前后的文件,观察二次渲染后文件的哪个部分不变,再将后门写入那个部分。
常见问题
单次过滤
php函数replace过滤"php”,但把文件名改成".pphphp"就可以绕过
条件竞争
php函数move_uploaded_file,先移动后过滤unlink。可以在删除前访问。 具体来说,可以在不断上传的过程中不断访问之,这个文件进行一个写入操作。(借助burp)
解析安全
格式变异
过滤时只过滤了php后缀,没有过滤php3、php4、php5、phtml等php程序
中间件解析(apache)
上传一个.htaccess,它可以更改目录下特定后缀的解析规则
<FilesMatch "shell.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
CVE-2013-4547 Nginx文件名逻辑漏洞
NGINX解析问题:后缀"1.jpg/.php"
针对性思路总结
CMS类
无资料时用常规测试思路,有资料参考资料即可。
编辑器 Ueditor
中间件 weblogic
CVE-2018-2894
CTF类
ThinkPHP 文件路径(涉及代码审计)