1022 字
5 分钟
HTTP头注入

一、概念#

HTTP 头注入 是一类当应用把不可信输入(URL 参数、表单、Cookie 值、Referer、Host 等)直接用于构造 HTTP 请求/响应头时产生的漏洞。攻击者可通过注入特殊字符(通常是换行/回车 CRLF 或构造的头字段)来:

  • 插入/修改额外响应头;

  • 通过插入空行终止头部并写入任意响应体(HTTP response splitting / CRLF injection);

  • 借此触发重定向篡改、会话固定/篡改、缓存投毒、跨站脚本(XSS)、权限绕过等后续攻击。

此外,Host Header 操作(Host header injection)是常见子类:攻击者篡改 Host 值以影响服务器/应用的内部逻辑(生成绝对 URL、验证回调、构建电子邮件或跳转)从而造成信息泄露、密码重置/回调滥用或绕过访问控制。


二、主要类型与攻击链#

  1. CRLF / HTTP Response Splitting(响应分割)

  2. Host Header Injection(主机头注入)

  3. Response Header Injection(响应头注入,不一定需要 CRLF)

  4. 与其它高级技术的联动


三、典型攻击向量与示例#

注意:下面示例用于学习/防御/授权测试。不要在未授权场景执行攻击。

  1. 简单 CRLF 注入(演示把用户输入放进 Location)
$next = $_GET['next']; // 不可信输入
header("Location: $next");
GET /redirect?next=/normal HTTP/1.1
Host: vulnerable.example
/redirect?next=/ok%0d%0aSet-Cookie:%20role=admin
  1. Set-Cookie 篡改

  2. Host header 绕过认证 / 回调劫持

  3. 缓存投毒与多头/重复头


四、如何检测#

  1. 手工测试(快速)

  2. 使用代理与工具

  3. 自动化扫描


五、常见后果 / 风险等级#

头注入的实际影响依赖于上下文与链路,可能包括:

  • 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");
// 验证为同源或白名单 URL
if (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)并做白名单验证与规范化。


七、防御措施#

  1. 输入验证与白名单

  2. 禁止/过滤 CRLF(规范化)

  3. 使用框架/库 API 而非手工拼接

  4. 对 Host 值不要盲目信任

  5. 安全的 Set-Cookie 策略

  6. 代理/缓存配置

  7. 安全日志与监控

  8. 安全评估与渗透测试


八、检测/修复快速清单#

  • 所有通过用户输入生成的头值均做白名单或严格校验;

  • 所有头值写入前删除 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 设置安全属性、并审查代理/缓存行为。

HTTP头注入
https://lab404.cn/posts/http-header-injection/
作者
见山
发布于
2025-11-02
许可协议
CC BY-NC-SA 4.0