【缺陷周话】第14期:HTTP 响应截断
字数 2044 2025-08-18 11:37:49

HTTP 响应截断漏洞分析与防御指南

1. HTTP 响应截断概述

HTTP响应截断(HTTP Response Splitting)是由于应用程序未对用户提交的数据进行严格过滤,当用户恶意提交包含CR(回车,即URL编码%0d或\r)和LF(换行符,即URL编码%0a或\n)的HTTP请求时,服务器可能会创建两个HTTP响应,攻击者可以控制第二个响应并加载攻击。

CWE ID: 113 - Improper Neutralization of CRLF Sequences in HTTP Headers ('HTTP Response Splitting')

2. 漏洞危害

HTTP响应截断本身不直接造成安全问题,而是通过攻击者控制的HTTP响应内容造成间接攻击:

  1. 跨站脚本攻击(XSS):攻击者可控制HTTP响应体内容,插入恶意JavaScript或HTML代码
  2. 页面劫持:攻击者可利用HTTP响应发起对其他目标服务器的请求,篡改页面内容
  3. Web缓存中毒:在同一代理服务器下,单个用户被攻击后,多个共享web缓存的用户会继续收到恶意内容
  4. 信息泄露:可能导致敏感信息泄露
  5. 拒绝服务:可能造成服务不可用

3. 漏洞原理分析

3.1 攻击机制

攻击者通过注入CRLF(回车换行)字符:

  • CR (Carriage Return): %0d 或 \r
  • LF (Line Feed): %0a 或 \n

当这些字符被注入到HTTP响应头中时,会欺骗服务器认为这是一个新的HTTP响应头开始的位置,从而将单个响应拆分为多个响应。

3.2 典型攻击示例

假设应用程序有如下代码:

String location = request.getParameter("page");
response.setHeader("Location", location);

攻击者可以构造如下恶意输入:

page=example.com%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2025%0d%0a%0d%0a%3Cscript%3Ealert(1)%3C/script%3E

这将导致服务器生成两个响应:

HTTP/1.1 302 Moved Temporarily
Location: example.com
Content-Length: 0

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 25

<script>alert(1)</script>

4. 漏洞代码示例与分析

4.1 缺陷代码

// CWE113_HTTP_Response_Splitting__Environment_addHeaderServlet_01.java
public void bad(HttpServletRequest request, HttpServletResponse response) throws Throwable {
    String data;
    // 从环境变量获取数据
    data = System.getenv("ADD");
    
    if (data != null) {
        // 直接将环境变量值设置到Location头
        response.addHeader("Location", data);
    }
}

漏洞点分析

  1. 直接从环境变量获取数据,未进行任何过滤
  2. 将未经验证的数据直接设置到HTTP响应头中
  3. 如果环境变量值包含CRLF字符,将导致响应拆分

4.2 修复代码

public void good(HttpServletRequest request, HttpServletResponse response) throws Throwable {
    String data;
    // 从环境变量获取数据
    data = System.getenv("ADD");
    
    if (data != null) {
        // 对数据进行过滤处理
        data = ESAPI.encoder().encodeForHTML(data);
        response.addHeader("Location", data);
    }
}

修复措施

  1. 使用ESAPI的encodeForHTML方法对数据进行编码
  2. 过滤掉潜在的CRLF等危险字符

5. 防御措施

5.1 输入验证

  1. 白名单验证:创建安全字符白名单,只接受完全由受认可字符组成的输入
  2. 黑名单过滤:过滤或编码CR(%0d, \r)、LF(%0a, \n)等特殊字符
  3. 严格长度限制:对输入数据进行长度限制

5.2 输出编码

  1. 使用安全API:使用专门的编码函数处理输出到HTTP头的数据

    • Java: ESAPI.encoder().encodeForHTML()
    • .NET: System.Web.Security.AntiXss.AntiXssEncoder.HtmlEncode()
    • PHP: htmlspecialchars(), urlencode()
  2. 头部值编码:对设置到HTTP头部的值进行URL编码或HTML实体编码

5.3 安全开发实践

  1. 避免直接拼接HTTP响应:使用框架提供的安全方法设置响应头
  2. 安全配置:配置Web服务器和应用程序框架以自动过滤CRLF序列
  3. 安全测试:在测试阶段专门测试CRLF注入场景

5.4 自动化检测

  1. 静态代码分析:使用源代码静态分析工具(如360代码卫士)自动检测潜在的HTTP响应截断漏洞
  2. 动态扫描:使用Web应用漏洞扫描器测试已部署应用
  3. 代码审查:在代码审查中特别关注HTTP头设置相关的代码

6. 相关CVE案例

CVE编号 受影响产品 漏洞描述
CVE-2018-1474 IBM BigFix Platform 9.2.0-9.2.14, 9.5-9.5.9 用户输入验证不当导致HTTP响应截断,可注入任意HTTP头
CVE-2018-11347 YunoHost 2.7.2-2.7.14 HTTP响应头注入漏洞,可导致用户重定向或缓存中毒
CVE-2018-7830 Modicon M340, Premium, Quantum PLC 嵌入式Web服务器存在HTTP响应截断漏洞,可导致拒绝服务
CVE-2018-1319 Apache Allura <1.8.1 恶意URL可导致HTTP响应截断,引发XSS或DoS

7. 总结

HTTP响应截断是一种严重的Web应用安全漏洞,虽然它本身不直接造成危害,但为多种攻击提供了基础。防御HTTP响应截断的关键在于:

  1. 严格验证所有用户输入:特别是将用于构造HTTP头的输入
  2. 正确编码输出:对输出到HTTP头的数据进行适当的编码
  3. 使用安全API:优先使用框架提供的安全方法而非手动构造响应
  4. 自动化检测:利用工具辅助发现潜在漏洞

通过实施这些措施,可以有效地防止HTTP响应截断漏洞,提高Web应用的整体安全性。

HTTP 响应截断漏洞分析与防御指南 1. HTTP 响应截断概述 HTTP响应截断(HTTP Response Splitting)是由于应用程序未对用户提交的数据进行严格过滤,当用户恶意提交包含CR(回车,即URL编码%0d或\r)和LF(换行符,即URL编码%0a或\n)的HTTP请求时,服务器可能会创建两个HTTP响应,攻击者可以控制第二个响应并加载攻击。 CWE ID : 113 - Improper Neutralization of CRLF Sequences in HTTP Headers ('HTTP Response Splitting') 2. 漏洞危害 HTTP响应截断本身不直接造成安全问题,而是通过攻击者控制的HTTP响应内容造成间接攻击: 跨站脚本攻击(XSS) :攻击者可控制HTTP响应体内容,插入恶意JavaScript或HTML代码 页面劫持 :攻击者可利用HTTP响应发起对其他目标服务器的请求,篡改页面内容 Web缓存中毒 :在同一代理服务器下,单个用户被攻击后,多个共享web缓存的用户会继续收到恶意内容 信息泄露 :可能导致敏感信息泄露 拒绝服务 :可能造成服务不可用 3. 漏洞原理分析 3.1 攻击机制 攻击者通过注入CRLF(回车换行)字符: CR (Carriage Return): %0d 或 \r LF (Line Feed): %0a 或 \n 当这些字符被注入到HTTP响应头中时,会欺骗服务器认为这是一个新的HTTP响应头开始的位置,从而将单个响应拆分为多个响应。 3.2 典型攻击示例 假设应用程序有如下代码: 攻击者可以构造如下恶意输入: 这将导致服务器生成两个响应: 4. 漏洞代码示例与分析 4.1 缺陷代码 漏洞点分析 : 直接从环境变量获取数据,未进行任何过滤 将未经验证的数据直接设置到HTTP响应头中 如果环境变量值包含CRLF字符,将导致响应拆分 4.2 修复代码 修复措施 : 使用ESAPI的encodeForHTML方法对数据进行编码 过滤掉潜在的CRLF等危险字符 5. 防御措施 5.1 输入验证 白名单验证 :创建安全字符白名单,只接受完全由受认可字符组成的输入 黑名单过滤 :过滤或编码CR(%0d, \r)、LF(%0a, \n)等特殊字符 严格长度限制 :对输入数据进行长度限制 5.2 输出编码 使用安全API :使用专门的编码函数处理输出到HTTP头的数据 Java: ESAPI.encoder().encodeForHTML() .NET: System.Web.Security.AntiXss.AntiXssEncoder.HtmlEncode() PHP: htmlspecialchars() , urlencode() 头部值编码 :对设置到HTTP头部的值进行URL编码或HTML实体编码 5.3 安全开发实践 避免直接拼接HTTP响应 :使用框架提供的安全方法设置响应头 安全配置 :配置Web服务器和应用程序框架以自动过滤CRLF序列 安全测试 :在测试阶段专门测试CRLF注入场景 5.4 自动化检测 静态代码分析 :使用源代码静态分析工具(如360代码卫士)自动检测潜在的HTTP响应截断漏洞 动态扫描 :使用Web应用漏洞扫描器测试已部署应用 代码审查 :在代码审查中特别关注HTTP头设置相关的代码 6. 相关CVE案例 | CVE编号 | 受影响产品 | 漏洞描述 | |---------|------------|----------| | CVE-2018-1474 | IBM BigFix Platform 9.2.0-9.2.14, 9.5-9.5.9 | 用户输入验证不当导致HTTP响应截断,可注入任意HTTP头 | | CVE-2018-11347 | YunoHost 2.7.2-2.7.14 | HTTP响应头注入漏洞,可导致用户重定向或缓存中毒 | | CVE-2018-7830 | Modicon M340, Premium, Quantum PLC | 嵌入式Web服务器存在HTTP响应截断漏洞,可导致拒绝服务 | | CVE-2018-1319 | Apache Allura <1.8.1 | 恶意URL可导致HTTP响应截断,引发XSS或DoS | 7. 总结 HTTP响应截断是一种严重的Web应用安全漏洞,虽然它本身不直接造成危害,但为多种攻击提供了基础。防御HTTP响应截断的关键在于: 严格验证所有用户输入 :特别是将用于构造HTTP头的输入 正确编码输出 :对输出到HTTP头的数据进行适当的编码 使用安全API :优先使用框架提供的安全方法而非手动构造响应 自动化检测 :利用工具辅助发现潜在漏洞 通过实施这些措施,可以有效地防止HTTP响应截断漏洞,提高Web应用的整体安全性。