HTTP 请求走私(HTTP Request Smuggling)是一种通过利用前端代理(如负载均衡器、CDN)和后端服务器在 解析 HTTP 请求时存在不一致性 的漏洞,从而实现 注入恶意请求 的攻击技术。
一、基本原理
HTTP 请求走私主要依赖两个请求头字段的不一致处理:
-
Content-Length
:指明请求体的长度。 -
Transfer-Encoding: chunked
:指明请求体是分块传输的。
不一致的场景
当前端和后端服务器对这两个头的解释不一致时,攻击者就能将多个请求“混淆”为一个请求,从而:
-
绕过认证
-
注入恶意请求
-
劫持用户会话
-
发起缓存投毒
-
进行 XSS / CSRF 攻击
常见的组合方式:
名称 | 条件 |
---|---|
CL.TE | 前端使用 Content-Length ,后端使用 Transfer-Encoding |
TE.CL | 前端使用 Transfer-Encoding ,后端使用 Content-Length |
TE.TE | 前端和后端都支持 Transfer-Encoding ,但处理方式不同 |
二、CL.TE 类型攻击示例
假设你有以下攻击场景:
-
前端(比如 Nginx)使用
Content-Length
解析请求; -
后端(比如 Apache)使用
Transfer-Encoding: chunked
解析请求。
攻击请求如下:
POST / HTTP/1.1
Host: vulnerable.site
Content-Length: 62
Transfer-Encoding: chunked
0
GET /admin HTTP/1.1
Host: vulnerable.site
解析过程:
前端(Nginx):
-
只看
Content-Length: 62
,把整段请求当作一个完整请求发送到后端。
后端(Apache):
-
看到
Transfer-Encoding: chunked
,开始以分块方式解析请求。 -
0\r\n\r\n
表示请求体结束。 -
后面的
GET /admin HTTP/1.1...
被解释为另一个完整的 HTTP 请求。
→ 后端就会执行这个攻击者构造的请求 GET /admin
,可能会绕过权限控制!
三、防御方式
-
统一前后端解析逻辑
-
确保前后端对 HTTP 请求头的处理一致。
-
-
禁止混合使用
Content-Length
和Transfer-Encoding
-
可以在 Web 应用防火墙(WAF)中检测并拒绝。
-
-
升级服务器
-
新版本的服务器通常修复了相关解析不一致的问题。
-
-
使用 Web Application Firewall(WAF)
-
例如 ModSecurity 可以检测这种模糊请求。
-
-
启用 Chunked 请求白名单机制
-
如果应用不需要 chunked 编码,直接禁用该特性。
-
以下是一个真实的 HTTP 请求走私(HTTP Request Smuggling)攻击案例,展示了其在现实世界中的危害性。
🧪 案例:利用请求走私劫持用户会话
安全公司 Outpost24 在一次渗透测试中发现,某 Web 应用存在 TE:CL 类型的请求走私漏洞。通过精心构造的请求,攻击者成功实现了响应队列的不同步(Response Queue Desynchronization),从而劫持了其他用户的会话。Outpost24+1Outpost24+1
攻击过程:
-
识别漏洞:使用工具检测到前端服务器使用
Transfer-Encoding
解析请求,而后端服务器使用Content-Length
,存在解析不一致。 -
构造恶意请求:发送包含两个请求的单个 HTTP 请求,其中第一个请求设置了特定的头部,使后端服务器将两个请求视为一个,从而导致响应队列不同步。
-
劫持会话:由于响应队列不同步,攻击者能够接收到属于其他用户的响应,其中可能包含敏感信息,如访问令牌。
🔍 案例:Apache Tomcat 中的请求走私漏洞(CVE-2021-33037)
Apache Tomcat 是广泛使用的 Java Web 服务器。在 2021 年,发现其存在一个请求走私漏洞(CVE-2021-33037),影响版本包括 8.5.0 至 8.5.66、9.0.0.M1 至 9.0.46 和 10.0.0-M1 至 10.0.6。该漏洞源于 Tomcat 在某些情况下未正确解析 HTTP 的 Transfer-Encoding
请求头,导致在与反向代理一起使用时可能发生请求走私。QualysPortSwigger+1Qualys+1
攻击者可以利用该漏洞,隐藏恶意请求在正常请求中,绕过安全检查,执行未授权的操作。该漏洞已在后续版本中修复,建议用户升级至最新版本。