一、概念
HTTP 头注入 是一类当应用把不可信输入(URL 参数、表单、Cookie 值、Referer、Host 等)直接用于构造 HTTP 请求/响应头时产生的漏洞。攻击者可通过注入特殊字符(通常是换行/回车 CRLF 或构造的头字段)来:
-
插入/修改额外响应头;
-
通过插入空行终止头部并写入任意响应体(HTTP response splitting / CRLF injection);
-
借此触发重定向篡改、会话固定/篡改、缓存投毒、跨站脚本(XSS)、权限绕过等后续攻击。
此外,Host Header 操作(Host header injection)是常见子类:攻击者篡改 Host 值以影响服务器/应用的内部逻辑(生成绝对 URL、验证回调、构建电子邮件或跳转)从而造成信息泄露、密码重置/回调滥用或绕过访问控制。
二、主要类型与攻击链
-
CRLF / HTTP Response Splitting(响应分割)
-
Host Header Injection(主机头注入)
-
Response Header Injection(响应头注入,不一定需要 CRLF)
-
与其它高级技术的联动
三、典型攻击向量与示例
注意:下面示例用于学习/防御/授权测试。不要在未授权场景执行攻击。
- 简单 CRLF 注入(演示把用户输入放进 Location)
$next = $_GET['next']; // 不可信输入header("Location: $next");GET /redirect?next=/normal HTTP/1.1Host: vulnerable.example/redirect?next=/ok%0d%0aSet-Cookie:%20role=admin-
Set-Cookie 篡改
-
Host header 绕过认证 / 回调劫持
-
缓存投毒与多头/重复头
四、如何检测
-
手工测试(快速)
-
使用代理与工具
-
自动化扫描
五、常见后果 / 风险等级
头注入的实际影响依赖于上下文与链路,可能包括:
-
XSS(通过 response splitting 注入脚本);
-
会话固定 / 劫持(通过篡改 Set-Cookie);
-
开放重定向 / phishing(篡改 Location);
-
缓存投毒,影响大量访客;
-
信息泄露 / 认证绕过(Host 注入导致内部路由被劫持)。
六、典型易出错代码示例
1) PHP(易受 CRLF)
易受攻击:
$name = $_GET['name'];header("Content-Disposition: attachment; filename=\"$name\"");如果 $name 包含 " 或 CRLF,会导致头注入或响应分割。
安全写法:
$name = $_GET['name'];// 1. 限定允许字符(白名单)if (!preg_match('/^[A-Za-z0-9_\-\.]{1,100}$/', $name)) { $name = 'download';}// 2. 对危险字符编码(可用 rawurlencode() 在某些场景)header("Content-Disposition: attachment; filename=\"" . addslashes($name) . "\"");2) Java Servlet
易受攻击:
String next = request.getParameter("next");response.setHeader("Location", next);安全写法:
String next = request.getParameter("next");// 验证为同源或白名单 URLif (isValidRelativePath(next)) { response.sendRedirect(next); // 使用容器 sendRedirect(会做部分规范化)} else { response.sendRedirect("/default");}3) Node.js (Express)
易受攻击:
res.set('Location', req.query.url); // 直接使用res.status(302).send();安全写法:
const url = req.query.url;if (isSafeUrl(url)) { res.redirect(url);} else { res.redirect('/');}总体原则:不要直接拼接未经校验的输入到头值;使用框架安全 API(例如 sendRedirect、setCookie helper)并做白名单验证与规范化。
七、防御措施
-
输入验证与白名单
-
禁止/过滤 CRLF(规范化)
-
使用框架/库 API 而非手工拼接
-
对 Host 值不要盲目信任
-
安全的 Set-Cookie 策略
-
代理/缓存配置
-
安全日志与监控
-
安全评估与渗透测试
八、检测/修复快速清单
-
所有通过用户输入生成的头值均做白名单或严格校验;
-
所有头值写入前删除 CR (
\r) 与 LF (\n)(拒绝带编码 CRLF 的输入); -
对生成外部 URL 不使用
Host原文,使用配置项或白名单; -
为关键 cookie 设置
HttpOnly; Secure; SameSite; -
在 CI/代码审查中加入检测:静态扫描 + 单元测试覆盖 header 相关逻辑;
-
对前端代理/缓存策略进行审查(重复头合并、首部优先级);
-
定期用 Burp / 专门实验室演练 HTTP header 注入 / 缓存投毒 / request smuggling 场景。
九、总结
-
本质:HTTP 头注入是把不可信数据放进 HTTP 头而未做严格校验的结果,攻击通常利用 CRLF、篡改 Host、或操纵特定头(Set-Cookie、Location)来实现更危险的后续利用(XSS、会话劫持、缓存投毒等)。owasp.org+1
-
防御要点:白名单/校验、禁止 CRLF、使用框架安全 API、不要信任 Host、为 cookie 设置安全属性、并审查代理/缓存行为。