HTTP响应拆分漏洞与防护(进阶篇)
字数 1036 2025-11-16 09:47:09

HTTP响应拆分漏洞与防护(进阶篇)

一、漏洞描述
HTTP响应拆分(HTTP Response Splitting)是一种利用输入验证不严的漏洞,通过注入特殊字符(如CRLF)来篡改HTTP响应头,实现响应头注入、缓存投毒、跨站脚本等攻击的漏洞。当应用程序将用户可控数据未经适当过滤就插入HTTP响应头时,攻击者可通过注入CRLF(Carriage Return Line Feed,即\r\n)序列来添加自定义响应头或拆分响应。

二、漏洞原理详解

  1. CRLF序列的作用:在HTTP协议中,\r\n表示一行的结束,响应头与正文之间用空行(\r\n\r\n)分隔
  2. 漏洞触发条件
    • 用户输入直接用于构造HTTP响应头(如Location、Set-Cookie等)
    • 未对\r\n等控制字符进行过滤或编码
  3. 攻击示例
    正常请求:/redirect?url=/home
    响应头:Location: /home
    
    恶意请求:/redirect?url=/home\r\nContent-Length:0\r\n\r\nHTTP/1.1 200 OK...
    攻击者通过注入CRLF创建恶意响应
    

三、漏洞验证步骤

  1. 识别注入点
    • 查找重定向参数、Cookie设置、文件名下载等头部参数
    • 测试输入\r\n后观察响应是否被截断
  2. 基础验证
    输入:test%0d%0aX-Injected:%20true
    观察响应头是否出现X-Injected字段
    
  3. 完整攻击验证
    • 尝试注入多个头部字段
    • 测试响应拆分能力(注入两个\r\n创建虚假响应)

四、进阶攻击场景

  1. Web缓存投毒
    • 通过注入Cache-Control头部污染代理服务器缓存
    • 使其他用户获取恶意缓存内容
  2. 安全功能绕过
    • 注入X-XSS-Protection:0禁用浏览器XSS防护
    • 修改CSP策略降低安全性
  3. 会话固定攻击
    • 控制Set-Cookie头部植入固定会话ID
  4. 跨站脚本组合攻击
    • 在Location头部注入JavaScript代码实现反射型XSS

五、防护方案详解

  1. 输入验证策略

    // 严格白名单验证
    public String validateRedirect(String input) {
        // 只允许相对路径或特定域名
        if (!input.matches("^/[a-zA-Z0-9/.-]*$")) {
            return "/default";
        }
        return input;
    }
    
  2. 输出编码防护

    # 对CRLF字符进行转义
    def safe_header_value(value):
        return value.replace('\r', '%0D').replace('\n', '%0A')
    
  3. 框架级防护

    • 使用Spring Security的RedirectStrategy
    • 采用Express.js的res.redirect()安全方法
    • 避免手动拼接响应头
  4. 安全头部设置

    # 添加安全头部减少攻击面
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options DENY;
    

六、测试与验证方法

  1. 自动化扫描
    • 使用Burp Suite的Scanner模块检测CRLF注入
    • 实施ZAP的响应拆分测试脚本
  2. 手动测试用例
    测试向量:
    %0d%0aInjected:header
    %0a%0dInjected:header
    %23%0d%0aInjected:header(URL编码变种)
    
  3. 代码审计要点
    • 检查所有设置HTTP头部的代码路径
    • 重点关注重定向、文件下载、Cookie操作功能

七、企业级防护架构

  1. WAF规则配置

    # ModSecurity规则
    SecRule ARGS "@contains %0d" "deny,msg:'CRLF injection'"
    SecRule ARGS "@contains %0a" "deny,msg:'CRLF injection'"
    
  2. SDLC集成

    • 在需求阶段明确头部参数的安全要求
    • 代码审查阶段检查CRLF处理逻辑
    • 渗透测试阶段专项测试响应拆分

该漏洞虽然较少见,但在特定场景下危害严重,需要结合严格输入验证和框架安全特性进行综合防护。

HTTP响应拆分漏洞与防护(进阶篇) 一、漏洞描述 HTTP响应拆分(HTTP Response Splitting)是一种利用输入验证不严的漏洞,通过注入特殊字符(如CRLF)来篡改HTTP响应头,实现响应头注入、缓存投毒、跨站脚本等攻击的漏洞。当应用程序将用户可控数据未经适当过滤就插入HTTP响应头时,攻击者可通过注入CRLF(Carriage Return Line Feed,即\r\n)序列来添加自定义响应头或拆分响应。 二、漏洞原理详解 CRLF序列的作用 :在HTTP协议中,\r\n表示一行的结束,响应头与正文之间用空行(\r\n\r\n)分隔 漏洞触发条件 : 用户输入直接用于构造HTTP响应头(如Location、Set-Cookie等) 未对\r\n等控制字符进行过滤或编码 攻击示例 : 三、漏洞验证步骤 识别注入点 : 查找重定向参数、Cookie设置、文件名下载等头部参数 测试输入\r\n后观察响应是否被截断 基础验证 : 完整攻击验证 : 尝试注入多个头部字段 测试响应拆分能力(注入两个\r\n创建虚假响应) 四、进阶攻击场景 Web缓存投毒 : 通过注入Cache-Control头部污染代理服务器缓存 使其他用户获取恶意缓存内容 安全功能绕过 : 注入X-XSS-Protection:0禁用浏览器XSS防护 修改CSP策略降低安全性 会话固定攻击 : 控制Set-Cookie头部植入固定会话ID 跨站脚本组合攻击 : 在Location头部注入JavaScript代码实现反射型XSS 五、防护方案详解 输入验证策略 : 输出编码防护 : 框架级防护 : 使用Spring Security的RedirectStrategy 采用Express.js的res.redirect()安全方法 避免手动拼接响应头 安全头部设置 : 六、测试与验证方法 自动化扫描 : 使用Burp Suite的Scanner模块检测CRLF注入 实施ZAP的响应拆分测试脚本 手动测试用例 : 代码审计要点 : 检查所有设置HTTP头部的代码路径 重点关注重定向、文件下载、Cookie操作功能 七、企业级防护架构 WAF规则配置 : SDLC集成 : 在需求阶段明确头部参数的安全要求 代码审查阶段检查CRLF处理逻辑 渗透测试阶段专项测试响应拆分 该漏洞虽然较少见,但在特定场景下危害严重,需要结合严格输入验证和框架安全特性进行综合防护。