工程实践:Yakit 随机分块传输绕过 WAF
在绕过 WAF(Web 应用防火墙)的各种技术中,随机分块传输编码(Random Chunked Transfer Encoding)是一个值得关注的方法。
其核心在于将请求数据拆分成多个大小随机的“块”,以此干扰那些需要完整数据包才能进行有效检测的安全设备。
现在,Yakit 的 WebFuzzer 模块也已正式支持这项技术。这意味着你可以更方便地在测试环境中尝试和验证随机分块传输的效果,无需切换工具或复杂配置。
本文我们就来看看它的具体实现与应用。
如何使用
Yakit 支持在 WebFuzzer 图形化界面和 Yaklang 代码中启用随机分块传输功能:
WebFuzzer 中启用 _
用户可以在 WebFuzzer 的“请求包配置”界面中直接开启“随机分块传输”开关。
- 功能配置:启用后,可以自定义分块的长度范围和发送延迟。
- 结果查看:请求发送后,具体的分块数据详情可以在单个数据包的详情页中查看。
发送完后,分块结果可以在每个数据包的详情页里面查看。
注意:启用随机分块传输,请求包的请求头会自动添加
Transfer-Encoding: chunked,并移除请求头content-length,这意味着请求包的"自动修复长度"不再生效。
在 Yaklang 代码中使用
开发者也可以通过在 Yaklang 代码中调用 poc 的相关函数来配置随机分块传输:
data = `
POST /post HTTP/1.1
Host: pie.dev
Content-Type: multipart/form-data; boundary=------------------------OFHnlKtUimimGcXvRSxgCZlIMAyDkuqsxeppbIFm
Content-Length: 308
--------------------------OFHnlKtUimimGcXvRSxgCZlIMAyDkuqsxeppbIFm
Content-Disposition: form-data; name="aaa"
bbb
--------------------------OFHnlKtUimimGcXvRSxgCZlIMAyDkuqsxeppbIFm
Content-Disposition: form-data; name="ccc"
ddd
--------------------------OFHnlKtUimimGcXvRSxgCZlIMAyDkuqsxeppbIFm--
`
poc.HTTP(data,poc.randomChunked(true),
poc.randomChunkedLength(10,25),
poc.randomChunkedDelay(50,200),
poc.randomChunkedResultHandler(func(id,data,totalTime,chunkTime){
print(sprintf("id:%v\tdata:%s\ttotalTime:%vms\tdelay:%vms\n", id,data,totalTime,chunkTime))
}))~
函数解释:
- poc.randomChunkedLength(10,25):设置分块的数据长度在 10 到 25 字节之间。
- poc.randomChunkedDelay(50,200):指定随机分块传输的延迟在 50-200ms 之间。
- poc.randomChunkedResultHandler:传入一个处理分块结果的回调函数 ()。该回调函数接收四个参数:
id(分块序号)、data(当前分块的数据)、totalTime(从发包开始的总耗时)和chunkTime(发送当前分块的耗时)。
介绍完基础的使用,下面使用一个 WAF 实际的例子来更深刻理解这个新功能。
实战演练:绕过安全狗 WAF
为了更深刻地理解该功能,本文将以安全狗( Safedog )WAF 和 Vulinbox 靶场为例,进行实战演示。
环境搭建
1、整体架构
为使 Vulinbox 靶场具备 WAF 拦截能力,测试环境采用 Apache 作为反向代理,其安装了安全狗 WAF 插件,并将流量转发至 Vulinbox 服务端口。
2、安装安全狗WAF**
在安全狗官网中下载 Apache 版本进行安装既可。
3、启用代理转发
在httpd.conf配置文件中,加载 proxy_http_module 和 proxy_connect_module 模块。
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
在 Listen.conf 中,配置 Apache 监听 81 端口。
Listen 81
创建虚拟主机配置文件,将访问 81 端口的请求代理到 Vulinbox 所在的:http://localhost:8787/ 。
#0localhost_81.conf
<VirtualHost _default_:81>
# 启用代理功能
ProxyRequests Off
ProxyPreserveHost On
# 配置代理到8787端口
ProxyPass / http://localhost:8787/
ProxyPassReverse / http://localhost:8787/
# 错误页面配置
ErrorDocument 400 /error/400.html
ErrorDocument 403 /error/403.html
ErrorDocument 404 /error/404.html
ErrorDocument 500 /error/500.html
ErrorDocument 501 /error/501.html
ErrorDocument 502 /error/502.html
ErrorDocument 503 /error/503.html
ErrorDocument 504 /error/504.html
ErrorDocument 505 /error/505.html
ErrorDocument 506 /error/506.html
ErrorDocument 507 /error/507.html
ErrorDocument 510 /error/510.html
</VirtualHost>
4、其它
在安全狗 WAF 的管理界面中,需启用针对 POST 报文的检测规则,以便后续验证绕过效果。
Vulinbox SQL 注入靶场实战
本次实战选取 Vulinbox 靶场中的“ POST 参数数字型 SQL 注入”场景。
SQL注入漏洞案例(复杂度递增)
1、常规攻击(被拦截)
在不使用分块传输的情况下,发送一个包含 SQL 注入 payload id=1 or 1=1 的 POST 请求,该请求被 WAF 成功拦截。
2、随机分块传输攻击(成功绕过)
在 Yakit WebFuzzer 中,针对相同的请求启用“随机分块传输”功能,将分块长度设置为 1-3 字节,延迟设为 10-100 毫秒。再次发送请求后,发现请求成功绕过了 WAF,服务器返回了预期的数据:
3、结果验证
在 Yakit 的请求详情中,可以清晰地看到 payload 被拆分成了多个小数据块进行发送,从而验证了分块传输的执行过程。
4、扩展应用
WebFuzzer 本身支持批量发包功能。
在实战中,可以将随机分块传输与批量发包结合,对目标 WAF 进行自动化模糊测试( Fuzzing ),以探索更多可能的绕过向量 。
总结
随机分块传输是一种有效的 WAF 绕过技术,其原理在于将攻击载荷拆分为多个数据块,从而干扰依赖完整数据包进行模式匹配的检测引擎。
本文详细介绍了 Yakit WebFuzzer 模块中新增的随机分块传输功能,它将这一攻击技术变得简单易用。
本文首发于 Yak Project 公众号,阅读原文。
