记一次请求走私学习
字数 1509 2025-08-25 22:58:28
HTTP请求走私攻击详解
1. 概述
HTTP请求走私(HTTP Request Smuggling)是一种利用前端服务器(如负载均衡、反向代理)和后端服务器对HTTP请求解析不一致的安全漏洞。这种攻击最早于2005年由Watchfire发现,危害程度为"重要"级别。
2. 核心概念
HTTP/1.1允许通过单个TCP或SSL/TLS连接发送多个HTTP请求。协议只需将HTTP请求背靠背放置,服务器通过解析标头来确定每个请求的结束位置和下一个请求的开始位置。
在多层架构中,来自多个用户的HTTP请求通过单个TCP/TLS连接路由。如果前后端服务器对请求的解析不一致,攻击者可以发送模糊消息,使后端服务器将其解释为两个不同的HTTP请求。
3. 攻击类型
3.1 CL.TE攻击 (前端使用Content-Length,后端使用Transfer-Encoding)
攻击原理:
- 前端服务器处理Content-Length头,确定请求主体长度
- 后端服务器处理Transfer-Encoding头,将消息体视为分块编码
示例攻击请求:
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 13
Transfer-Encoding: chunked
0
SMUGGLED
攻击过程:
- 前端服务器看到Content-Length:13,认为请求体为13字节(直到SMUGGLED结束)
- 后端服务器看到Transfer-Encoding: chunked,处理第一个块(0表示结束)
- "SMUGGLED"被后端视为下一个请求的开始
3.2 TE.CL攻击 (前端使用Transfer-Encoding,后端使用Content-Length)
示例攻击请求:
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 3
Transfer-Encoding: chunked
8
SMUGGLED
0
攻击过程:
- 前端服务器处理Transfer-Encoding头,将消息体视为分块编码
- 处理第一个块(8字节,"SMUGGLED")
- 处理第二个块(0字节,视为终止请求)
- 后端服务器看到Content-Length:3,只读取"8\r\n"作为请求体
- 剩余的"SMUGGLED\r\n0\r\n\r\n"被当作下一个请求
3.3 TE.TE攻击 (前后端都支持Transfer-Encoding,但通过模糊标头诱导不一致处理)
模糊Transfer-Encoding标头的方法:
Transfer-Encoding: xchunked
Transfer-Encoding : chunked
Transfer-Encoding: chunked
Transfer-Encoding: x
Transfer-Encoding:[tab]chunked
[space]Transfer-Encoding: chunked
X: X[\n]Transfer-Encoding: chunked
Transfer-Encoding
: chunked
攻击原理:
利用不同服务器对HTTP规范实现的细微差异,使一个服务器处理Transfer-Encoding而另一个忽略它。
4. 实际攻击步骤
4.1 CL.TE攻击步骤
- 将GET请求改为POST请求
- 添加Content-Length头和POST请求数据
- 构造类似示例的走私请求
- 对数据包连续请求两次
4.2 TE.CL攻击步骤
- 将GET请求改为POST请求
- 关闭Repeater的Update Content-length功能
- 添加Content-length和Transfer-Encoding头
- 构造分块编码请求(注意0后面必须有两个\r\n)
- 对数据包连续请求两次
4.3 TE.TE攻击步骤
- 将GET请求改为POST请求
- 关闭Repeater的Update Content-length功能
- 添加多个Transfer-Encoding头
- 构造分块编码请求(注意0后面必须有两个\r\n)
- 对数据包连续请求两次
5. 防御措施
- 前后端服务器使用相同版本的HTTP协议
- 禁用后端连接重用
- 使用HTTP/2(强制使用TLS,且具有更严格的解析规则)
- 前端服务器规范化请求后再转发
- 后端服务器拒绝模糊请求