Web安全之HTTP响应头拆分攻击(HTTP Response Splitting)详解
字数 1159 2025-11-19 15:35:01
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表示头部结束。
- CR(Carriage Return,
-
漏洞触发条件:
- 用户输入(如URL参数、表单字段)未经过滤直接拼接到HTTP响应头中(如
Location、Set-Cookie)。 - 攻击者通过输入包含
%0d%0a(URL编码的CRLF)的恶意内容,欺骗服务器将注入内容识别为新的响应头。
- 用户输入(如URL参数、表单字段)未经过滤直接拼接到HTTP响应头中(如
三、攻击步骤示例
假设某网站通过URL参数设置重定向路径:
http://example.com/redirect?url=/dashboard
服务器返回响应:
HTTP/1.1 302 Found
Location: /dashboard
...
-
攻击注入:
攻击者构造恶意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,用于拆分响应头。
-
服务器响应篡改:
服务器返回的响应变为: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。
- 第一个响应被提前终止(
四、攻击影响
- 缓存污染:将恶意响应缓存到代理服务器,影响其他用户。
- 安全功能绕过:篡改
X-Content-Type-Options等安全头。 - 会话固定:通过注入
Set-Cookie头强制用户使用攻击者的会话ID。 - 跨站脚本(XSS):直接注入恶意脚本。
五、防御策略
-
输入过滤:
- 严格验证用户输入,拒绝包含CRLF(
\r\n)或换行符的字符。 - 示例代码(Node.js):
function sanitizeInput(input) { return input.replace(/[\r\n]/g, ""); // 移除所有CRLF字符 }
- 严格验证用户输入,拒绝包含CRLF(
-
输出编码:
- 在将用户输入拼接到响应头前,对特殊字符进行URL编码或转义。
- 例如,将
\n转换为%0A,避免被解释为换行。
-
使用安全API:
- 避免手动拼接HTTP头部,使用框架内置方法(如Express.js的
res.redirect()会自动过滤CRLF)。
- 避免手动拼接HTTP头部,使用框架内置方法(如Express.js的
-
安全配置:
- 设置严格的
Content-Security-Policy,降低XSS风险。 - 启用
HttpOnly属性防止Cookie被脚本窃取。
- 设置严格的
六、漏洞检测
- 手工测试:在参数中尝试输入
%0d%0a,观察响应是否被拆分。 - 工具扫描:使用Burp Suite等工具检测HTTP头部注入漏洞。
总结:HTTP响应头拆分攻击利用协议解析漏洞,核心在于严格控制用户输入中的CRLF字符。通过过滤、编码与安全编程实践,可有效防御此类攻击。