0x00 基础校验方法
前端校验文件名
1.禁用js或修改js
2.抓包绕过
Content-Type检测
1.抓包修改
0x01 黑名单检验后缀名
1.双写绕过
pphphp
2.大小写绕过
pHp,phP,pHP,Php,PHp,PhP,PHP
3.%00截断(需要php5.2x以下 没记错的话)
1.直接在文件名后面截断
2.在保存路径处写文件名再截断
特别注意保存路径
4.其他php后缀
php3,php4,php5,php7,phpt,phps,phtml(一般unix系的服务器默认解析,windows基本没戏)
.htaccess文件解析规则绕过
<FilesMatch "xxx.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
或者
AddType application/x-httpd-php .xxx
6.不符合windows文件命名规则的文件名&&NTFS 流
[注意 使用wamp进行测试,7.1.2,7.2.10版本下的php不可以实现该操作,猜测为在7.1x版本以后对move_uploaded_file进行修改,限制了这种不符合命名规则的方法,后续继续研究]
- xxx.php.
- xxx.php(空格)
- xxx.php:1.jpg
- xxx.php::$DATA
- xxx.php::$DATA…
文件名中加冒号(:)
对于这种方式进行绕过所生成的文件名内容为空,需要结合php的windows环境的叠加特性进行文件重写,条件算是比较苛刻
一是要文件上传后没有重命名,二是要windows环境
双引号" = 点号.
大于符号> = 问号?
小于符号< = 星号*
xxx.<
xxx.>>>
对xxx.php进行重写
$DATA
对于$DATA,在NTFS文件系统中,所有文件都至少包含一个流,完整的包含流信息的文件名格式应该是
<filename>:<stream name>:<stream type>
Attention: default stream name for file is $DATA
# 也就是说对于文件xxx.txt,它的完整文件名应该是
xxx.txt:$DATA:$DATA
# 默认文件名为
xxx.txt::$DATA
# 当然stream name可以由用户指定
xxx.txt:sdasdas:$DATA
----------
# 对于文件夹来说stream type = $INDEX_ALLOCATION
# 默认stream name = $I30
# 例如在 cmd 中执行如下代码
md new_dir:$I30:$INDEX_ALLOCATION
参考资料 https://msdn.microsoft.com/en-us/library/dn393272.aspx
7.结合文件包含漏洞
随便上传一个含一句话木马内容的txt或jpg文件
结合该web应用的文件包含漏洞,包含上传的文件即可
8.服务器解析漏洞
①IIS5.x-6.x 解析漏洞
目录解析=> /xx.asp/xx.jpg (服务器默认会把.asp, .asa目录下的文件都解析成asp文件)
文件解析=> /xx.asp;.jpg (服务器默认不解析;号后的内容)
IIS6.0默认的可执行文件有
.asp
.asa
.cer
.cdx
②apache解析漏洞
Apache 解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断
/xxx.php.sdadsa
其他配置问题:(config以及htaccess)
AddHandler php5-script .php
=>只要文件名中有.php即可被当作php文件执行,例如xxx.php.jpg
AddType application/x-httpd-php .xxx
=>后缀名为.xxx的文件被当作php文件进行解析
③nginx解析漏洞
nginx默认以CGI的方式支持PHP解析,通过在配置文件中正则匹配设置SCRIPT_FILENAME。当访问…/xxx.jpg/1.php时,$fastcgi_script_name会被设置成"xxx.jpg/1.php",然后构造成SCRIPT_FILENAME传递给PHP CGI。
如果php开启了fix_pathinfo选项,其便会认为SCRIPT_FILENAME是xxx.jpg,而1.php是PATH_INFO,因此会将xxx.jpg当成php文件解析
1.jpg/1.php
1.jpg%00.php
1.jpg/%20\0.php
0x02 对于waf的一些绕过方法(内容检测绕过)
1.文件头检查
gif图像文件头 GIF89a
PNG图像文件头 ‰PNG(89 50 4E 47 )
2.其他(waf逻辑漏洞,如安全狗等)
以下都是出现过的漏洞,现已被修补,但思路差不多,就是乱改…
如果有waf源码另说
删除Content-Type
删除Content-Disposition字段里的空格
增加一个空格
修改Content-Disposition字段值的大小写
构造Boundary边界不一致
文件名处回车
多个Content-Disposition
文件名加一堆点
长文件名绕过,文件名使用中文等
name="file1"改成其他filexxxx
0x03 参考资料
https://msdn.microsoft.com/en-us/library/dn393272.aspx
https://www.waitalone.cn/php-windows-upload.html
https://thief.one/2016/09/22/上传木马姿势汇总-欢迎补充/