HTTP请求走私是一种利用前端服务器(如反向代理、负载均衡器、CDN)与后端服务器对HTTP请求解析不一致,从而将恶意请求“走私”到正常请求流中的攻击技术。其核心危害在于绕过安全控制、劫持用户会话、访问未授权API、进行Web缓存投毒等。

漏洞成因与分类

漏洞的根本原因是前端和后端服务器对Content-Length (CL)Transfer-Encoding (TE) 这两个HTTP请求头处理方式不同,导致对请求体结束位置的判断出现分歧。主要分为以下四类:

攻击类型 前端服务器解析依据 后端服务器解析依据 关键特征
CL.TE Content-Length Transfer-Encoding 前端根据CL确定请求体长度,后端期待TE分块编码。
TE.CL Transfer-Encoding Content-Length 前端处理分块请求,后端根据CL读取请求体。
TE.TE Transfer-Encoding(处理特定值) Transfer-Encoding(处理不同值) 前后端均声明支持TE,但对TE头的值(如chunkedxchunked)或格式(如空格、大小写)的解析存在差异。
CL.CL 第一个Content-Length 第二个Content-Length 请求中包含两个具有不同值的CL头,前后端选择了不同的值进行解析。

攻击示例与利用

以最常见的CL.TE型攻击为例,攻击者构造一个包含冲突头部的请求,使前端认为的请求结束位置与后端不同,从而将后续请求的一部分“走私”为当前请求的一部分。

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

0

SMUGGLED
  • 前端视角:看到Content-Length: 13,认为请求体是 0\r \r SMUGGLED(共13字节),并将整个请求转发给后端。
  • 后端视角:看到Transfer-Encoding: chunked,按分块编码解析。0\r \r表示一个长度为0的块,即请求体在此结束。而后面的SMUGGLED会被视为下一个请求的开始。

当攻击者连续发送两个这样的请求时,SMUGGLED就可能被后端当作第二个独立请求(如GET请求)的一部分执行,实现请求走私。

检测方法

  1. 时间延迟检测:发送一个可能造成走私的请求,如果服务器处理异常(如等待超时),则可能存在漏洞。
  2. 响应差异检测:发送两个请求,观察第二个请求的响应是否受到第一个请求中“走私”内容的影响。
  3. 工具自动化:使用Burp Suite的 HTTP Request Smuggler 插件或 h2cSmuggler(针对HTTP/2)等工具进行高效扫描。

防御措施

  • 统一解析:确保前端和后端服务器使用相同品牌、版本的HTTP解析器,并配置一致。
  • 禁用歧义头:在前端代理处规范化请求,例如始终优先使用Transfer-Encoding,或完全禁用分块编码。
  • 升级协议:使用HTTP/2,因其具有严格的分帧机制,能从根本上消除请求走私的解析歧义。同时需注意防范HTTP/2降级攻击。
  • 纵深防御:在后端应用层实施额外的安全校验,不依赖前端代理传递的请求边界信息。

参考来源

 

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐