文件上传BypassWaf
基于HTTP协议绕过
0x1:通过使用 Connection: keep-alive 达到一次传输多个http包的效果;
0x2:使用分块传输/ Chunked Transfer达到分割敏感字词绕过;
通过在头部加入 Transfer-Encoding: chunked 之后,就代表这个报文采用了分块编码。每个分块包含十六进制的长度值和数据,长度值独占一行,长度不包括它结尾的,也不包括分块数据结尾的,且最后需要用0独占一行表示结束。
没有分块时,传入敏感参数,被waf拦截:
使用chunked分块传输后,waf未拦截:
tips:Burp Suite 有现成的分块插件
0x3:使用ibm037编码/ Charset = xxx编码绕过
原理:利用不常见的编码格式绕过waf
ibmxxx编码在以下服务或语言中可被解析识别
Nginx, uWSGl-Django-Python2 & 3
Apache-TOMCAT7/8- JVM1.6/1.8-JSP
Apache- PHP5 (mod_ php & FastCGI)
IIS (6, 7.5, 8, 10) on ASP Classic, ASP.NET and PHP7.1- FastCGI
0x4:HTTP协议未覆盖
利用 Content-type: multipart/form-date
绕过上传的边界(boundary)限制,通过多boundary定义,使waf检测范围和实际上传范围不一致,从而绕过waf上传恶意内容:
0x5:截断 filename
注意在 filename 之前加入了 0x00,而有些 WAF 在检测前会删除 HTTP 协议中的 0x00,这样就导致了 WAF 认为是含有 filename 的普通上传,而后端 PHP 则认为是 POST 参数。
0x6:双写上传描述行
双写后,一些 WAF 会取第二行,而实际 PHP 会获取第一行。
0x7:两个 Content-Type
tips:boundary依然是a
还有很多…举一反三,就不一一列举了。
宝塔&安全狗绕过
就比如无收费的宝塔在前者检测上就基本没有防护能力:
上传php后缀文件,内容为正常图片
回显bad request400
,实际上就是宝塔的拦截
当我们在 Content-Disposition: form-data; name="file"; filename="result5.php"
三者之间修改就可以绕过。
1 | filename="result5.php |
PS:安全狗对上传全程无反应
其他方法绕过
0x1:垃圾数据
用多参数或者无效数据填充请求,超出WAF的检测限制范围,从而绕过防御;
过免费的宝塔 yyds
0x2:高并发(大力出奇迹)
使用自动化工具短时间内发送大量攻击数据包。
缺点:动静太大,容易被业务察觉并封禁;