Web安全之HTTP响应头拆分攻击(HTTP Response Splitting)详解
字数 1159 2025-11-19 15:35:01

Web安全之HTTP响应头拆分攻击(HTTP Response Splitting)详解

一、攻击描述
HTTP响应头拆分攻击是一种利用输入验证不严的漏洞,通过注入特殊字符(如CRLF)来篡改HTTP响应头的攻击手法。攻击者能够在服务器返回的HTTP响应中插入额外的头信息或伪造响应体,可能导致缓存污染、跨站脚本(XSS)、会话固定等二次攻击。

二、漏洞原理

  1. CRLF字符意义

    • CR(Carriage Return,\r,十六进制0x0D)表示回车。
    • LF(Line Feed,\n,十六进制0x0A)表示换行。
    • 在HTTP协议中,\r\n被用作头字段的分隔符,连续两个\r\n表示头部结束。
  2. 漏洞触发条件

    • 用户输入(如URL参数、表单字段)未经过滤直接拼接到HTTP响应头中(如LocationSet-Cookie)。
    • 攻击者通过输入包含%0d%0a(URL编码的CRLF)的恶意内容,欺骗服务器将注入内容识别为新的响应头。

三、攻击步骤示例
假设某网站通过URL参数设置重定向路径:

http://example.com/redirect?url=/dashboard

服务器返回响应:

HTTP/1.1 302 Found
Location: /dashboard
...
  1. 攻击注入
    攻击者构造恶意URL:

    http://example.com/redirect?url=/dashboard%0d%0aContent-Length:0%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:text/html%0d%0a%0d%0a<script>alert('XSS')</script>
    
    • %0d%0a被解码为\r\n,用于拆分响应头。
  2. 服务器响应篡改
    服务器返回的响应变为:

    HTTP/1.1 302 Found
    Location: /dashboard
    Content-Length: 0
    
    HTTP/1.1 200 OK
    Content-Type: text/html
    
    <script>alert('XSS')</script>
    
    • 第一个响应被提前终止(Content-Length:0后接空行),后续内容被解析为新的响应,触发XSS。

四、攻击影响

  1. 缓存污染:将恶意响应缓存到代理服务器,影响其他用户。
  2. 安全功能绕过:篡改X-Content-Type-Options等安全头。
  3. 会话固定:通过注入Set-Cookie头强制用户使用攻击者的会话ID。
  4. 跨站脚本(XSS):直接注入恶意脚本。

五、防御策略

  1. 输入过滤

    • 严格验证用户输入,拒绝包含CRLF(\r\n)或换行符的字符。
    • 示例代码(Node.js):
      function sanitizeInput(input) {
        return input.replace(/[\r\n]/g, ""); // 移除所有CRLF字符
      }
      
  2. 输出编码

    • 在将用户输入拼接到响应头前,对特殊字符进行URL编码或转义。
    • 例如,将\n转换为%0A,避免被解释为换行。
  3. 使用安全API

    • 避免手动拼接HTTP头部,使用框架内置方法(如Express.js的res.redirect()会自动过滤CRLF)。
  4. 安全配置

    • 设置严格的Content-Security-Policy,降低XSS风险。
    • 启用HttpOnly属性防止Cookie被脚本窃取。

六、漏洞检测

  1. 手工测试:在参数中尝试输入%0d%0a,观察响应是否被拆分。
  2. 工具扫描:使用Burp Suite等工具检测HTTP头部注入漏洞。

总结:HTTP响应头拆分攻击利用协议解析漏洞,核心在于严格控制用户输入中的CRLF字符。通过过滤、编码与安全编程实践,可有效防御此类攻击。

Web安全之HTTP响应头拆分攻击(HTTP Response Splitting)详解 一、攻击描述 HTTP响应头拆分攻击是一种利用输入验证不严的漏洞,通过注入特殊字符(如CRLF)来篡改HTTP响应头的攻击手法。攻击者能够在服务器返回的HTTP响应中插入额外的头信息或伪造响应体,可能导致缓存污染、跨站脚本(XSS)、会话固定等二次攻击。 二、漏洞原理 CRLF字符意义 : CR(Carriage Return, \r ,十六进制 0x0D )表示回车。 LF(Line Feed, \n ,十六进制 0x0A )表示换行。 在HTTP协议中, \r\n 被用作头字段的分隔符,连续两个 \r\n 表示头部结束。 漏洞触发条件 : 用户输入(如URL参数、表单字段)未经过滤直接拼接到HTTP响应头中(如 Location 、 Set-Cookie )。 攻击者通过输入包含 %0d%0a (URL编码的CRLF)的恶意内容,欺骗服务器将注入内容识别为新的响应头。 三、攻击步骤示例 假设某网站通过URL参数设置重定向路径: 服务器返回响应: 攻击注入 : 攻击者构造恶意URL: %0d%0a 被解码为 \r\n ,用于拆分响应头。 服务器响应篡改 : 服务器返回的响应变为: 第一个响应被提前终止( Content-Length:0 后接空行),后续内容被解析为新的响应,触发XSS。 四、攻击影响 缓存污染 :将恶意响应缓存到代理服务器,影响其他用户。 安全功能绕过 :篡改 X-Content-Type-Options 等安全头。 会话固定 :通过注入 Set-Cookie 头强制用户使用攻击者的会话ID。 跨站脚本(XSS) :直接注入恶意脚本。 五、防御策略 输入过滤 : 严格验证用户输入,拒绝包含CRLF( \r\n )或换行符的字符。 示例代码(Node.js): 输出编码 : 在将用户输入拼接到响应头前,对特殊字符进行URL编码或转义。 例如,将 \n 转换为 %0A ,避免被解释为换行。 使用安全API : 避免手动拼接HTTP头部,使用框架内置方法(如Express.js的 res.redirect() 会自动过滤CRLF)。 安全配置 : 设置严格的 Content-Security-Policy ,降低XSS风险。 启用 HttpOnly 属性防止Cookie被脚本窃取。 六、漏洞检测 手工测试 :在参数中尝试输入 %0d%0a ,观察响应是否被拆分。 工具扫描 :使用Burp Suite等工具检测HTTP头部注入漏洞。 总结 :HTTP响应头拆分攻击利用协议解析漏洞,核心在于严格控制用户输入中的CRLF字符。通过过滤、编码与安全编程实践,可有效防御此类攻击。