基于 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"
三者之间修改就可以绕过。
HTTP
1 2 3 4 5 6 7 8 9 10 11 12 | filename=”result5.php filename=result5.php filename=;filename=”result5.php” //ps:filename=”1.jpg”;filename=”result5.php”被拦截 filename=’result5.php’ filename=’result5.php //ps:filename=result5.php’上传文件后缀多了单引号 filename=”result5.php[00].jpg” //宝塔不可-换行思路 filename=”result5 . p h p” |
PS:安全狗对上传全程无反应
其他方法绕过
0x1:垃圾数据
用多参数或者无效数据填充请求,超出 WAF 的检测限制范围,从而绕过防御;
过免费的宝塔 yyds
0x2:高并发(大力出奇迹)
使用自动化工具短时间内发送大量攻击数据包。
缺点:动静太大,容易被业务察觉并封禁;