基于HTTP协议绕过

0x1:通过使用 Connection: keep-alive 达到一次传输多个http包的效果;

图片

0x2:使用分块传输/ Chunked Transfer达到分割敏感字词绕过;

通过在头部加入 Transfer-Encoding: chunked 之后,就代表这个报文采用了分块编码。每个分块包含十六进制的长度值和数据,长度值独占一行,长度不包括它结尾的,也不包括分块数据结尾的,且最后需要用0独占一行表示结束。

没有分块时,传入敏感参数,被waf拦截:

img

使用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

image-20220705165759294

注意在 filename 之前加入了 0x00,而有些 WAF 在检测前会删除 HTTP 协议中的 0x00,这样就导致了 WAF 认为是含有 filename 的普通上传,而后端 PHP 则认为是 POST 参数。

0x6:双写上传描述行

image-20220705165919767

双写后,一些 WAF 会取第二行,而实际 PHP 会获取第一行。

0x7:两个 Content-Type

image-20220705170107850

tips:boundary依然是a

还有很多…举一反三,就不一一列举了。

宝塔&安全狗绕过

就比如无收费的宝塔在前者检测上就基本没有防护能力:

上传php后缀文件,内容为正常图片

回显bad request400,实际上就是宝塔的拦截

image-20211225163200690

当我们在 Content-Disposition: form-data; name="file"; filename="result5.php" 三者之间修改就可以绕过。

image-20211225163801733

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:高并发(大力出奇迹)

使用自动化工具短时间内发送大量攻击数据包。

缺点:动静太大,容易被业务察觉并封禁;

图片

参考: