HTTP请求走私攻击详解
字数 779 2025-11-07 12:34:03
HTTP请求走私攻击详解
描述
HTTP请求走私攻击是一种利用HTTP协议解析差异的安全漏洞,攻击者通过构造特殊的HTTP请求,使前端服务器(如反向代理、负载均衡器)和后端服务器对请求边界产生不同理解,导致请求被误解析。这种攻击可导致缓存投毒、会话劫持、绕过安全限制等严重后果。
前置知识
- HTTP/1.1支持持久连接(Keep-Alive),多个请求可通过同一TCP连接发送
- 请求边界通过Content-Length(CL)和Transfer-Encoding(TE)头部界定
- 当前端与后端服务器对协议解析不一致时,会产生请求走私
攻击原理分步解析
第一步:理解边界界定机制
- Content-Length机制:明确指定消息体字节数
POST /test HTTP/1.1 Content-Length: 13 \r\n hello world! - Transfer-Encoding: chunked分块编码:
POST /test HTTP/1.1 Transfer-Encoding: chunked \r\n 5\r\n hello\r\n 6\r\n world!\r\n 0\r\n
第二步:识别解析差异点
关键漏洞点:服务器对CL和TE头部处理优先级不同
- 案例1:前端使用CL,后端使用TE
- 案例2:前端使用TE,后端使用CL
- 案例3:两者都存在时的优先级冲突
第三步:CL-TE攻击(前端认CL,后端认TE)
攻击请求构造:
POST / HTTP/1.1
Host: example.com
Content-Length: 6
Transfer-Encoding: chunked
\r\n
0\r\n # 后端认为这是结束标记
\r\n
G # 前端认为这是下一个请求的开始
结果:字符"G"会被前端当作新请求的起始字符
第四步:TE-CL攻击(前端认TE,后端认CL)
攻击请求构造:
POST / HTTP/1.1
Host: example.com
Content-Length: 3
Transfer-Encoding: chunked
\r\n
8\r\n # 前端解析分块长度
SMUGGLED\r\n # 前端认为这是第一个消息体
0\r\n # 前端认为请求结束
\r\n
后端因优先处理CL,只读取3字节("8\r\n"),剩余内容会被附加到下一个请求
第五步:防御方案
- 禁用连接重用:对敏感请求使用Connection: close
- 使用HTTP/2:彻底消除协议歧义问题
- 服务器配置:确保前后端使用相同解析逻辑
- 前端服务器:规范化有歧义的请求后再转发
- 后端服务器:拒绝包含CL和TE双重头部的请求
检测方法
- 时间延迟技术:通过响应时间差异检测请求队列
- 差异反射:利用走私内容影响后续请求的响应
此攻击的危害程度取决于具体应用场景,但可能造成严重的安全绕过问题。