高级漏洞篇之HTTP请求走私专题
字数 1958 2025-08-10 16:34:36

HTTP请求走私攻击全面解析与防御指南

1. HTTP请求走私概述

HTTP请求走私攻击(HTTP Request Smuggling)是一种利用前端服务器(如反向代理、负载均衡)与后端服务器对HTTP请求边界解析不一致的安全漏洞。攻击者通过精心构造的HTTP请求,在一个请求中"夹带"另一个或多个请求,绕过安全控制或干扰其他用户的请求。

1.1 漏洞产生原理

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

  • Content-Length头:以字节为单位指定消息正文长度
  • Transfer-Encoding头:指定使用分块编码(chunked)

当这两种方法同时存在且服务器处理不一致时,就会产生请求走私漏洞。

1.2 攻击危害

HTTP请求走私可导致:

  • 绕过前端安全控制
  • 未授权访问敏感数据
  • 窃取其他用户的请求和会话
  • 反射型XSS攻击
  • Web缓存投毒
  • 开放重定向
  • 全站接管等严重后果

2. HTTP请求走私攻击类型

2.1 CL.TE漏洞

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

攻击示例

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

0
SMUGGLED

原理

  • 前端认为请求体长度为13字节(包括"0\r\n\r\n")
  • 后端使用分块编码,看到"0"后认为请求结束
  • "SMUGGLED"被当作下一个请求的开始

2.2 TE.CL漏洞

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

攻击示例

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

8
SMUGGLED
0

原理

  • 前端使用分块编码,看到"0"后认为请求结束
  • 后端使用Content-Length头,只读取前3字节("8\r\n")
  • 剩余部分被当作下一个请求

2.3 TE.TE漏洞(混淆TE头)

特征:前后端都支持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

3. HTTP/2请求走私

3.1 HTTP/2降级风险

HTTP/2降级是指前端将HTTP/2请求转换为HTTP/1.1请求转发给后端。这种转换过程可能引入请求走私漏洞。

3.2 H2.CL漏洞

特征:前端使用HTTP/2内置长度机制,后端使用Content-Length头

攻击示例

POST / HTTP/2
Host: vulnerable-website.com
Content-Length: 0

SMUGGLED

3.3 H2.TE漏洞

特征:前端忽略Transfer-Encoding头,后端处理Transfer-Encoding头

攻击示例

POST / HTTP/2
Host: vulnerable-website.com
Transfer-Encoding: chunked

0
SMUGGLED

4. 高级攻击技术

4.1 响应队列投毒

通过走私完整请求,使前端服务器将后端响应映射到错误请求,导致:

  • 窃取其他用户的响应
  • 破坏通过同一连接的其他用户请求

攻击流程

  1. 走私一个完整请求
  2. 后端返回两个响应
  3. 前端将第二个响应保存到队列
  4. 后续请求会收到队列中的响应

4.2 HTTP/2请求拆分

在HTTP/2降级时,在头中拆分请求:

攻击示例

:method POST
:path /example
:authority vulnerable-website.com
foo bar\r\n
\r\n
GET /x HTTP/1.1\r\n
Host: x

4.3 HTTP请求隧道

当服务器不重用连接时,仍可通过隧道技术:

  • 绕过前端安全措施
  • 泄漏内部头
  • 实现盲请求隧道

4.4 客户端异步攻击(CSD)

使受害者的浏览器与漏洞网站连接不同步:

攻击流程

  1. 受害者访问恶意网站
  2. 浏览器向漏洞网站发送跨域请求
  3. 恶意前缀留在服务器连接上
  4. 后续请求被附加到恶意前缀

5. 漏洞检测方法

5.1 计时技术

检测CL.TE
发送CL大于实际长度的请求,观察是否超时

检测TE.CL
发送被空行分隔的两部分请求,观察是否超时

5.2 响应差异

发送两次请求:

  1. 第一次:魔改请求包
  2. 第二次:正常请求
    观察第二次响应是否异常

6. 漏洞利用场景

6.1 绕过前端安全控制

示例

POST /home HTTP/1.1
Host: vulnerable-website.com
Content-Length: 62
Transfer-Encoding: chunked

0
GET /admin HTTP/1.1
Host: vulnerable-website.com
Foo: x

6.2 窃取用户请求

通过评论等功能存储其他用户请求:

POST /post/comment HTTP/1.1
Host: vulnerable-website.com
Content-Length: 400

comment=GET / HTTP/1.1
Host: vulnerable-website.com
Cookie: session=jJNLJs2RKpbg9EQ7iWrcfzwaTvMw81Rj

6.3 反射型XSS

通过UA头注入:

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

0
GET / HTTP/1.1
User-Agent: <script>alert(1)</script>
Foo: X

6.4 Web缓存投毒

攻击流程

  1. 走私请求引发开放重定向
  2. 缓存恶意响应
  3. 其他用户访问时收到恶意内容

7. 防御措施

7.1 通用防御

  1. 使用HTTP/2端到端:尽可能禁用HTTP降级
  2. 规范化请求:前端规范化不明确请求,后端拒绝不明确请求
  3. 连接处理:异常时默认丢弃连接
  4. 严格验证:拒绝包含可疑头或方法的请求

7.2 针对CL.TE/TE.CL

  • 禁用有冲突的头部组合
  • 强制使用单一长度指定方法

7.3 针对HTTP/2

  • 避免不必要的HTTP/2降级
  • 严格验证降级后的HTTP/1.1请求

7.4 针对响应队列投毒

  • 限制每个连接的请求/响应数量
  • 实施严格的连接超时

8. 总结

HTTP请求走私是一种危害严重且难以检测的Web安全漏洞,攻击者可以利用它绕过安全控制、窃取敏感数据甚至接管整个系统。防御这类攻击需要全面了解HTTP协议细节,并在整个请求处理链中实施一致的请求解析策略。通过端到端使用HTTP/2、严格请求验证和规范化,以及适当的连接管理,可以有效降低此类攻击的风险。

HTTP请求走私攻击全面解析与防御指南 1. HTTP请求走私概述 HTTP请求走私攻击(HTTP Request Smuggling)是一种利用前端服务器(如反向代理、负载均衡)与后端服务器对HTTP请求边界解析不一致的安全漏洞。攻击者通过精心构造的HTTP请求,在一个请求中"夹带"另一个或多个请求,绕过安全控制或干扰其他用户的请求。 1.1 漏洞产生原理 HTTP规范提供了两种指定请求结束位置的方法: Content-Length头 :以字节为单位指定消息正文长度 Transfer-Encoding头 :指定使用分块编码(chunked) 当这两种方法同时存在且服务器处理不一致时,就会产生请求走私漏洞。 1.2 攻击危害 HTTP请求走私可导致: 绕过前端安全控制 未授权访问敏感数据 窃取其他用户的请求和会话 反射型XSS攻击 Web缓存投毒 开放重定向 全站接管等严重后果 2. HTTP请求走私攻击类型 2.1 CL.TE漏洞 特征 :前端使用Content-Length头,后端使用Transfer-Encoding头 攻击示例 : 原理 : 前端认为请求体长度为13字节(包括"0\r\n\r\n") 后端使用分块编码,看到"0"后认为请求结束 "SMUGGLED"被当作下一个请求的开始 2.2 TE.CL漏洞 特征 :前端使用Transfer-Encoding头,后端使用Content-Length头 攻击示例 : 原理 : 前端使用分块编码,看到"0"后认为请求结束 后端使用Content-Length头,只读取前3字节("8\r\n") 剩余部分被当作下一个请求 2.3 TE.TE漏洞(混淆TE头) 特征 :前后端都支持Transfer-Encoding头,但可通过混淆使其一端不处理 混淆方法 : 3. HTTP/2请求走私 3.1 HTTP/2降级风险 HTTP/2降级是指前端将HTTP/2请求转换为HTTP/1.1请求转发给后端。这种转换过程可能引入请求走私漏洞。 3.2 H2.CL漏洞 特征 :前端使用HTTP/2内置长度机制,后端使用Content-Length头 攻击示例 : 3.3 H2.TE漏洞 特征 :前端忽略Transfer-Encoding头,后端处理Transfer-Encoding头 攻击示例 : 4. 高级攻击技术 4.1 响应队列投毒 通过走私完整请求,使前端服务器将后端响应映射到错误请求,导致: 窃取其他用户的响应 破坏通过同一连接的其他用户请求 攻击流程 : 走私一个完整请求 后端返回两个响应 前端将第二个响应保存到队列 后续请求会收到队列中的响应 4.2 HTTP/2请求拆分 在HTTP/2降级时,在头中拆分请求: 攻击示例 : 4.3 HTTP请求隧道 当服务器不重用连接时,仍可通过隧道技术: 绕过前端安全措施 泄漏内部头 实现盲请求隧道 4.4 客户端异步攻击(CSD) 使受害者的浏览器与漏洞网站连接不同步: 攻击流程 : 受害者访问恶意网站 浏览器向漏洞网站发送跨域请求 恶意前缀留在服务器连接上 后续请求被附加到恶意前缀 5. 漏洞检测方法 5.1 计时技术 检测CL.TE : 发送CL大于实际长度的请求,观察是否超时 检测TE.CL : 发送被空行分隔的两部分请求,观察是否超时 5.2 响应差异 发送两次请求: 第一次:魔改请求包 第二次:正常请求 观察第二次响应是否异常 6. 漏洞利用场景 6.1 绕过前端安全控制 示例 : 6.2 窃取用户请求 通过评论等功能存储其他用户请求: 6.3 反射型XSS 通过UA头注入: 6.4 Web缓存投毒 攻击流程 : 走私请求引发开放重定向 缓存恶意响应 其他用户访问时收到恶意内容 7. 防御措施 7.1 通用防御 使用HTTP/2端到端 :尽可能禁用HTTP降级 规范化请求 :前端规范化不明确请求,后端拒绝不明确请求 连接处理 :异常时默认丢弃连接 严格验证 :拒绝包含可疑头或方法的请求 7.2 针对CL.TE/TE.CL 禁用有冲突的头部组合 强制使用单一长度指定方法 7.3 针对HTTP/2 避免不必要的HTTP/2降级 严格验证降级后的HTTP/1.1请求 7.4 针对响应队列投毒 限制每个连接的请求/响应数量 实施严格的连接超时 8. 总结 HTTP请求走私是一种危害严重且难以检测的Web安全漏洞,攻击者可以利用它绕过安全控制、窃取敏感数据甚至接管整个系统。防御这类攻击需要全面了解HTTP协议细节,并在整个请求处理链中实施一致的请求解析策略。通过端到端使用HTTP/2、严格请求验证和规范化,以及适当的连接管理,可以有效降低此类攻击的风险。