Nginx 主机头注入攻击与防御指南
一、攻击原理与危害
主机头注入攻击通过篡改 HTTP 请求的 Host 头字段,诱导服务器处理非法请求,主要危害包括:
- 缓存污染:攻击者将恶意内容注入缓存,影响其他用户访问;
- 敏感信息泄露:服务器可能返回与伪造 Host 头关联的敏感数据;
- 钓鱼攻击:伪造合法域名诱导用户访问恶意站点。
二、防御方案与配置示例
1. 严格校验 Host 头合法性
在 Nginx 配置中强制校验 Host 头,拦截非法请求:
# 默认 server 块处理未匹配的 Host
server {
listen 80 default_server;
server_name _;
return 403; # 或 return 444 直接断开连接
}
# 合法业务 server 块
server {
listen 80;
server_name example.com 192.168.1.32;
# 正则匹配合法 Host 值
if ($http_host !~* ^(example\.com|192\.168\.1\.32)$) {
return 403;
}
# 业务逻辑...
}
- 关键点:
- 通过 default_server 拦截所有未明确允许的 Host 头;
- 使用正则表达式限制合法域名/IP,避免模糊匹配漏洞。
2. 反向代理场景固定 Host 头
当 Nginx 作为反向代理时,禁止透传客户端原始 Host 头:
location / {
proxy_pass http://backend;
proxy_set_header Host $host; # 固定为当前 server_name
proxy_set_header X-Real-IP $remote_addr;
# 其他代理配置...
}
- 说明:proxy_set_header Host $host 覆盖客户端输入,防止后端服务接收伪造 Host 头。
3. 过滤 Host 头中的特殊字符
拦截包含注入特征的非法字符(如分号、括号):
# 正则匹配非法字符
if ($http_host ~* "[;'()<>]") {
return 403;
}
- **作用:**阻止通过特殊字符绕过 Host 校验。
4. 集成安全模块增强防御
- WAF 模块(如 ModSecurity):通过规则库检测异常 Host 头,支持复杂逻辑拦截;
- Lua 脚本动态校验:扩展 Nginx 功能,自定义 Host 头校验逻辑(如黑白名单、频率限制)。
三、注意事项
- 语法规范: Nginx 配置中 if 指令需与条件语句保留空格,避免语法错误导致配置失效;
- 配置验证: 每次修改后执行 nginx -t 检查语法,并通过 nginx -s reload 重载配置;
- 多层级防护:
- 结合 CDN 或防火墙过滤非法 IP 和流量;
- 定期审计 Host 头日志,发现异常请求模式。
通过上述措施,可有效阻断主机头注入攻击,同时保障业务的高可用性与安全性。