本地验证

JS禁用、Burp改包、本地提交

后缀黑名单验证

大小写、加空格、符号点(系统特性)、::$DATA(Windows平台)

过滤不迭代问题

例如,".php. .“方法:这针对的是在过滤中,代码中去掉末尾的点,再首位去空,再进行后缀过滤点情形。

后缀白名单验证

MIME(使用FILETYPE而不是后缀验证)

后缀白名单验证

MIME、%00、0x00截断

  1. 其中,MIME主要修改Content-Type项;
  2. %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 文件路径(涉及代码审计)