HTTP请求走私攻击的变异形式:CL.TE与TE.CL详解
字数 1387 2025-11-29 01:04:35
HTTP请求走私攻击的变异形式:CL.TE与TE.CL详解
HTTP请求走私(HTTP Request Smuggling)是一种利用HTTP协议解析差异的攻击技术,攻击者通过构造恶意请求干扰服务器对请求边界的判断,从而劫持其他用户的请求或获取敏感数据。CL.TE和TE.CL是两种常见的走私变体,分别基于Content-Length(CL)和Transfer-Encoding(TE)头部的解析冲突。
一、攻击原理:解析差异的来源
-
HTTP请求边界判定
- 服务器通常依赖以下两种头部之一判断请求体的结束位置:
Content-Length:明确指定请求体的字节数。Transfer-Encoding: chunked:使用分块编码,以0\r\n\r\n标记结束。
- 当请求同时包含这两个头部时,不同服务器(如前端代理 vs 后端服务器)可能优先采用不同的规则,导致解析不一致。
- 服务器通常依赖以下两种头部之一判断请求体的结束位置:
-
CL.TE变异(前端使用CL,后端使用TE)
- 攻击场景:前端代理服务器以
Content-Length为准,后端服务器以Transfer-Encoding为准。 - 恶意请求示例:
POST / HTTP/1.1 Host: example.com Content-Length: 6 Transfer-Encoding: chunked 0 \r\n GET /admin HTTP/1.1 - 解析过程:
- 前端代理看到
CL=6,将整个请求体视为0\r\n\n(6字节),转发给后端。 - 后端看到
Transfer-Encoding: chunked,按分块编码解析:第一块0表示结束,后续的GET /admin被当作下一个请求执行。
- 前端代理看到
- 攻击场景:前端代理服务器以
-
TE.CL变异(前端使用TE,后端使用CL)
- 攻击场景:前端代理优先处理
Transfer-Encoding,后端优先处理Content-Length。 - 恶意请求示例:
POST / HTTP/1.1 Host: example.com Content-Length: 4 Transfer-Encoding: chunked 12 GET /admin HTTP/1.1 0 - 解析过程:
- 前端代理按分块编码解析:第一块
12(十六进制)表示18字节,读取GET /admin HTTP/1.1后,遇到0结束,转发剩余内容(本例中无剩余)。 - 后端看到
CL=4,只读取前4字节(12\r\n),剩余的GET /admin被保留到下一个请求。
- 前端代理按分块编码解析:第一块
- 攻击场景:前端代理优先处理
二、攻击步骤与验证
-
探测解析差异
- 发送同时包含
CL和TE的测试请求,观察响应延迟或异常(如400错误)。 - 例如,在TE.CL场景中,故意发送畸形的分块数据,若后端因
CL提前截断请求,可能返回超时。
- 发送同时包含
-
构造走私请求
- 根据探测结果选择CL.TE或TE.CL模式,在请求体中隐藏恶意请求(如访问管理员路径)。
- 通过多次发送走私请求,使恶意代码“拼接”到其他用户的正常请求前。
-
实现攻击效果
- 劫持会话:将其他用户的Cookie附加到走私的
GET /admin请求中,以该用户身份执行操作。 - 缓存投毒:走私请求修改缓存内容,使后续用户访问恶意资源。
- 劫持会话:将其他用户的Cookie附加到走私的
三、防御措施
- 标准化请求处理
- 前后端服务器统一采用相同的解析优先级(如忽略
CL当TE存在时)。
- 前后端服务器统一采用相同的解析优先级(如忽略
- 禁用冗余头部
- 若请求同时包含
CL和TE,直接拒绝或强制使用某一规则。
- 若请求同时包含
- 使用HTTP/2
- HTTP/2使用帧机制而非文本解析,从根本上避免边界歧义。
- 安全测试
- 使用工具(如HTTP Request Smuggler)定期检测漏洞。
四、总结
CL.TE和TE.CL攻击依赖服务器链对HTTP协议实现的差异,通过精心构造的请求混淆请求边界。防御需确保前后端解析一致性,并减少对用户输入头部的信任。