HTTP响应拆分漏洞与防护(进阶篇)
字数 1036 2025-11-16 09:47:09
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等控制字符进行过滤或编码
- 攻击示例:
正常请求:/redirect?url=/home 响应头:Location: /home 恶意请求:/redirect?url=/home\r\nContent-Length:0\r\n\r\nHTTP/1.1 200 OK... 攻击者通过注入CRLF创建恶意响应
三、漏洞验证步骤
- 识别注入点:
- 查找重定向参数、Cookie设置、文件名下载等头部参数
- 测试输入\r\n后观察响应是否被截断
- 基础验证:
输入:test%0d%0aX-Injected:%20true 观察响应头是否出现X-Injected字段 - 完整攻击验证:
- 尝试注入多个头部字段
- 测试响应拆分能力(注入两个\r\n创建虚假响应)
四、进阶攻击场景
- Web缓存投毒:
- 通过注入Cache-Control头部污染代理服务器缓存
- 使其他用户获取恶意缓存内容
- 安全功能绕过:
- 注入X-XSS-Protection:0禁用浏览器XSS防护
- 修改CSP策略降低安全性
- 会话固定攻击:
- 控制Set-Cookie头部植入固定会话ID
- 跨站脚本组合攻击:
- 在Location头部注入JavaScript代码实现反射型XSS
五、防护方案详解
-
输入验证策略:
// 严格白名单验证 public String validateRedirect(String input) { // 只允许相对路径或特定域名 if (!input.matches("^/[a-zA-Z0-9/.-]*$")) { return "/default"; } return input; } -
输出编码防护:
# 对CRLF字符进行转义 def safe_header_value(value): return value.replace('\r', '%0D').replace('\n', '%0A') -
框架级防护:
- 使用Spring Security的RedirectStrategy
- 采用Express.js的res.redirect()安全方法
- 避免手动拼接响应头
-
安全头部设置:
# 添加安全头部减少攻击面 add_header X-Content-Type-Options nosniff; add_header X-Frame-Options DENY;
六、测试与验证方法
- 自动化扫描:
- 使用Burp Suite的Scanner模块检测CRLF注入
- 实施ZAP的响应拆分测试脚本
- 手动测试用例:
测试向量: %0d%0aInjected:header %0a%0dInjected:header %23%0d%0aInjected:header(URL编码变种) - 代码审计要点:
- 检查所有设置HTTP头部的代码路径
- 重点关注重定向、文件下载、Cookie操作功能
七、企业级防护架构
-
WAF规则配置:
# ModSecurity规则 SecRule ARGS "@contains %0d" "deny,msg:'CRLF injection'" SecRule ARGS "@contains %0a" "deny,msg:'CRLF injection'" -
SDLC集成:
- 在需求阶段明确头部参数的安全要求
- 代码审查阶段检查CRLF处理逻辑
- 渗透测试阶段专项测试响应拆分
该漏洞虽然较少见,但在特定场景下危害严重,需要结合严格输入验证和框架安全特性进行综合防护。