网络安全之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命令查看验证。
}
}