分块传输编码基础
分块传输编码(Chunked Transfer Encoding)是HTTP/1.1协议中一种数据传输机制,主要用于在未知响应内容大小时,将消息体分割为多个“块”逐个发送,每个块以十六进制块大小开头,后跟块内容块结束符(CRLF),最后以一个大小为0的块标识传输结束,其原始设计目的是提升大文件传输的灵活性,但在安全领域,却被研究者发现可被用于绕过Web应用防火墙(WAF)的检测机制。

WAF检测原理与局限性
WAF作为Web应用安全的第一道防线,主要通过特征匹配、语义分析等方式检测恶意请求,其核心逻辑包括:
- 静态规则检测:基于已知攻击特征(如SQL注入、XSS的关键字、特殊符号组合)进行拦截;
- 长度限制:对请求体长度、参数数量等设定阈值,防止超长载荷攻击;
- 编码解码检查:对URL编码、Base64等编码格式进行解码后检测,但往往忽略HTTP协议层级的编码方式。
WAF对HTTP协议细节的处理存在盲区,许多WAF默认开启“规范化处理”,会对请求体进行统一格式调整(如去除多余空格、合并连续参数),但分块传输编码的块分割特性可能破坏这种规范化,导致恶意载荷在检测时被“拆解”或“隐藏”。
分块传输绕过WAF的实战原理
攻击者利用分块传输绕过WAF的核心思路是通过协议层级的编码混淆,干扰WAF的载荷重组与检测逻辑,具体实现方式包括:
块分割与载荷分散
将恶意载荷(如<script>alert(1)</script>)拆分为多个块,每个块仅包含部分恶意特征。

POST / HTTP/1.1
Host: example.com
Transfer-Encoding: chunked
2
<sc
CRIPT
5
>alert(
1
3
)</scr
ipt>
0
CRLF
WAF若仅对单个块进行独立检测,可能因每个块均不构成完整攻击特征而放行,最终在服务端重组为完整恶意载荷。
块大小混淆
利用块大小的动态变化干扰WAF的长度校验,通过交替发送大小为1字节和大量空字节(如0x0A)的块,使WAF误判请求体长度或忽略关键载荷。
混合编码嵌套
将分块传输与其他编码方式(如URL编码、双重Base64)结合,进一步增加载荷的检测难度,对每个块内容先进行URL编码,再通过分块传输发送,WAF若未同时解码和重组,可能遗漏真实攻击意图。
靶场环境验证与防御策略
在WAF靶场环境中,可通过搭建模拟WAF(如ModSecurity)与后端服务(如Nginx+PHP),构造上述分块传输请求,验证绕过效果,常见绕过场景包括:

- SQL注入绕过:将
UNION SELECT拆分到不同块中; - XSS绕过:利用块分割破坏标签闭合检测;
- 文件上传绕过:通过分块混淆文件头校验。
针对此类绕过技术,防御策略需从协议层与检测逻辑双管齐下:
- 协议严格解析:强制WAF完整解析分块传输,确保重组所有块后再进行载荷检测;
- 多维度关联分析:结合块大小、块顺序、载荷上下文进行关联判断,而非孤立检测单个块;
- 深度解码支持:对分块传输中的嵌套编码(如Chunked+Base64)进行递归解码;
- 异常行为监控:检测块大小异常波动、块间逻辑矛盾等非常规模式。
分块传输编码绕过WAF的案例揭示了协议层安全细节的重要性,随着攻击者对HTTP协议理解的深入,WAF的检测逻辑需不断迭代,从“特征匹配”向“协议语义理解”演进,安全研究人员与防御者应持续关注协议规范的边缘场景,通过靶场实战验证漏洞,构建更健壮的Web安全防护体系。




















