HTTP请求走私攻击的变异形式:CL.TE与TE.CL详解
字数 1387 2025-11-29 01:04:35

HTTP请求走私攻击的变异形式:CL.TE与TE.CL详解

HTTP请求走私(HTTP Request Smuggling)是一种利用HTTP协议解析差异的攻击技术,攻击者通过构造恶意请求干扰服务器对请求边界的判断,从而劫持其他用户的请求或获取敏感数据。CL.TE和TE.CL是两种常见的走私变体,分别基于Content-Length(CL)Transfer-Encoding(TE)头部的解析冲突。

一、攻击原理:解析差异的来源

  1. HTTP请求边界判定

    • 服务器通常依赖以下两种头部之一判断请求体的结束位置:
      • Content-Length:明确指定请求体的字节数。
      • Transfer-Encoding: chunked:使用分块编码,以0\r\n\r\n标记结束。
    • 当请求同时包含这两个头部时,不同服务器(如前端代理 vs 后端服务器)可能优先采用不同的规则,导致解析不一致。
  2. CL.TE变异(前端使用CL,后端使用TE)

    • 攻击场景:前端代理服务器以Content-Length为准,后端服务器以Transfer-Encoding为准。
    • 恶意请求示例
      POST / HTTP/1.1
      Host: example.com
      Content-Length: 6
      Transfer-Encoding: chunked
      
      0
      \r\n
      GET /admin HTTP/1.1
      
    • 解析过程
      • 前端代理看到CL=6,将整个请求体视为0\r\n\n(6字节),转发给后端。
      • 后端看到Transfer-Encoding: chunked,按分块编码解析:第一块0表示结束,后续的GET /admin被当作下一个请求执行。
  3. TE.CL变异(前端使用TE,后端使用CL)

    • 攻击场景:前端代理优先处理Transfer-Encoding,后端优先处理Content-Length
    • 恶意请求示例
      POST / HTTP/1.1
      Host: example.com
      Content-Length: 4
      Transfer-Encoding: chunked
      
      12
      GET /admin HTTP/1.1
      0
      
    • 解析过程
      • 前端代理按分块编码解析:第一块12(十六进制)表示18字节,读取GET /admin HTTP/1.1后,遇到0结束,转发剩余内容(本例中无剩余)。
      • 后端看到CL=4,只读取前4字节(12\r\n),剩余的GET /admin被保留到下一个请求。

二、攻击步骤与验证

  1. 探测解析差异

    • 发送同时包含CLTE的测试请求,观察响应延迟或异常(如400错误)。
    • 例如,在TE.CL场景中,故意发送畸形的分块数据,若后端因CL提前截断请求,可能返回超时。
  2. 构造走私请求

    • 根据探测结果选择CL.TE或TE.CL模式,在请求体中隐藏恶意请求(如访问管理员路径)。
    • 通过多次发送走私请求,使恶意代码“拼接”到其他用户的正常请求前。
  3. 实现攻击效果

    • 劫持会话:将其他用户的Cookie附加到走私的GET /admin请求中,以该用户身份执行操作。
    • 缓存投毒:走私请求修改缓存内容,使后续用户访问恶意资源。

三、防御措施

  1. 标准化请求处理
    • 前后端服务器统一采用相同的解析优先级(如忽略CLTE存在时)。
  2. 禁用冗余头部
    • 若请求同时包含CLTE,直接拒绝或强制使用某一规则。
  3. 使用HTTP/2
    • HTTP/2使用帧机制而非文本解析,从根本上避免边界歧义。
  4. 安全测试
    • 使用工具(如HTTP Request Smuggler)定期检测漏洞。

四、总结

CL.TE和TE.CL攻击依赖服务器链对HTTP协议实现的差异,通过精心构造的请求混淆请求边界。防御需确保前后端解析一致性,并减少对用户输入头部的信任。

HTTP请求走私攻击的变异形式:CL.TE与TE.CL详解 HTTP请求走私(HTTP Request Smuggling)是一种利用HTTP协议解析差异的攻击技术,攻击者通过构造恶意请求干扰服务器对请求边界的判断,从而劫持其他用户的请求或获取敏感数据。CL.TE和TE.CL是两种常见的走私变体,分别基于 Content-Length(CL) 和 Transfer-Encoding(TE) 头部的解析冲突。 一、攻击原理:解析差异的来源 HTTP请求边界判定 服务器通常依赖以下两种头部之一判断请求体的结束位置: Content-Length :明确指定请求体的字节数。 Transfer-Encoding: chunked :使用分块编码,以 0\r\n\r\n 标记结束。 当请求同时包含这两个头部时,不同服务器(如前端代理 vs 后端服务器)可能优先采用不同的规则,导致解析不一致。 CL.TE变异(前端使用CL,后端使用TE) 攻击场景 :前端代理服务器以 Content-Length 为准,后端服务器以 Transfer-Encoding 为准。 恶意请求示例 : 解析过程 : 前端代理看到 CL=6 ,将整个请求体视为 0\r\n\n (6字节),转发给后端。 后端看到 Transfer-Encoding: chunked ,按分块编码解析:第一块 0 表示结束,后续的 GET /admin 被当作 下一个请求 执行。 TE.CL变异(前端使用TE,后端使用CL) 攻击场景 :前端代理优先处理 Transfer-Encoding ,后端优先处理 Content-Length 。 恶意请求示例 : 解析过程 : 前端代理按分块编码解析:第一块 12 (十六进制)表示18字节,读取 GET /admin HTTP/1.1 后,遇到 0 结束,转发剩余内容(本例中无剩余)。 后端看到 CL=4 ,只读取前4字节( 12\r\n ),剩余的 GET /admin 被保留到下一个请求。 二、攻击步骤与验证 探测解析差异 发送同时包含 CL 和 TE 的测试请求,观察响应延迟或异常(如400错误)。 例如,在TE.CL场景中,故意发送畸形的分块数据,若后端因 CL 提前截断请求,可能返回超时。 构造走私请求 根据探测结果选择CL.TE或TE.CL模式,在请求体中隐藏恶意请求(如访问管理员路径)。 通过多次发送走私请求,使恶意代码“拼接”到其他用户的正常请求前。 实现攻击效果 劫持会话 :将其他用户的Cookie附加到走私的 GET /admin 请求中,以该用户身份执行操作。 缓存投毒 :走私请求修改缓存内容,使后续用户访问恶意资源。 三、防御措施 标准化请求处理 前后端服务器统一采用相同的解析优先级(如忽略 CL 当 TE 存在时)。 禁用冗余头部 若请求同时包含 CL 和 TE ,直接拒绝或强制使用某一规则。 使用HTTP/2 HTTP/2使用帧机制而非文本解析,从根本上避免边界歧义。 安全测试 使用工具(如HTTP Request Smuggler)定期检测漏洞。 四、总结 CL.TE和TE.CL攻击依赖服务器链对HTTP协议实现的差异,通过精心构造的请求混淆请求边界。防御需确保前后端解析一致性,并减少对用户输入头部的信任。