文件上传如何绕过网络应用防火墙(WAF)的限制?插图

基于 HTTP 协议绕过

0x1:通过使用 Connection: keep-alive 达到一次传输多个 http 包的效果;
图片
0x2:使用分块传输 / Chunked Transfer 达到分割敏感字词绕过

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

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

img

使用 chunked 分块传输后,waf 未拦截:

文件上传如何绕过网络应用防火墙(WAF)的限制?插图3

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

HTTP

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 的检测限制范围,从而绕过防御;

文件上传如何绕过网络应用防火墙(WAF)的限制?插图11

过免费的宝塔 yyds

0x2:高并发(大力出奇迹)

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

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

图片