【缺陷周话】第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响应内容造成间接攻击:
- 跨站脚本攻击(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 典型攻击示例
假设应用程序有如下代码:
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);
}
}
漏洞点分析:
- 直接从环境变量获取数据,未进行任何过滤
- 将未经验证的数据直接设置到HTTP响应头中
- 如果环境变量值包含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);
}
}
修复措施:
- 使用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()
- Java:
-
头部值编码:对设置到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应用的整体安全性。