网络安全之Host Header Injection(Host头注入),表现为 Host头注入 + 开放重定向(Open Redirect)

原理

Host  是客户端可控的HTTP请求头(攻击者可以随便修改)。
程序代码直接拿  req.headers["Host"]  拼接,生成绝对URL放到  Location  响应头:

python示例

漏洞代码示例

redirect_url = f"https://{request.host}/dashboard"
return redirect(redirect_url)

Java示例

@Controller
public class RedirectController {

@GetMapping("/redirect")
public void redirect(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 危险:直接获取客户端可控Host头
String host = request.getHeader("Host");
// 拼接绝对URL放到Location
String targetUrl = "https://" + host + "/dashboard";
// 302重定向
response.setStatus(HttpServletResponse.SC_FOUND);
response.setHeader("Location", targetUrl);
}
}

✅ 正常安全写法:写死固定域名,不要从请求Host动态拼接,或者只允许相对路径( /dashboard ,不带域名)。

风险场景

1. 钓鱼跳转:攻击者把Host改成evil.com,302重定向指向恶意网站,诱导用户输入账号密码。
2. 密码重置投毒(Password Reset Poisoning):重置邮件里的链接域名被篡改为攻击者域名,劫持重置Token,接管账号。
3. 缓存投毒:CDN/代理缓存这个恶意响应,后续正常用户访问也会被带到恶意站点。
4. 部分框架场景还能进一步触发 SSRF。

区分:良性 vs 漏洞

  • 如果只是相对路径 Location: /home:Host怎么改都不会带出域名,没问题。
  • 如果 Location变成绝对URL,域名完全跟随你传入的Host变化 → 判定Host头注入漏洞。

目前遇到的场景是,钓鱼跳转。

本项目的架构是前端-nginx-后端。http的处理都在nginx。所以需要修改nginx.conf文件,配置如下:
http{
server{
#server配置
location /api/ {

}
这里api后带着下划线,所以出现了可以产生钓鱼跳转的场景。也就是location随着host变动。将下划线去掉这个场景就会消失。可以通过curl命令查看验证。
}
}

posted @ 2026-10-14 09:18  浮丶尘  阅读(13)  评论(0)    收藏  举报