HTTP Host头攻击漏洞与防护
字数 1175 2025-11-28 14:46:15
HTTP Host头攻击漏洞与防护
1. 漏洞描述
HTTP Host头攻击是指攻击者恶意篡改HTTP请求中的Host头,利用应用程序对Host头的不安全处理,实现密码重置毒化、缓存投毒、业务逻辑绕过等攻击。此类漏洞的根源在于应用错误地将Host头作为可信数据使用(如生成链接、校验域名或路由请求),而未验证其合法性。
2. Host头的作用与风险场景
2.1 正常用途
- 虚拟主机路由:当多个网站共享同一IP时,服务器依赖Host头区分不同域名。
- 生成绝对URL:应用可能通过Host头动态生成链接(如密码重置邮件中的链接)。
- 跨域校验:部分应用用Host头验证请求来源是否合法。
2.2 攻击风险场景
- 密码重置毒化:攻击者篡改Host头,使密码重置链接指向恶意域名,窃取用户令牌。
- 缓存投毒:反向缓存服务器可能将恶意Host头请求缓存,污染其他用户的缓存内容。
- 业务逻辑绕过:应用通过Host头进行访问控制时,篡改Host头可绕过限制。
3. 漏洞利用步骤(以密码重置毒化为例)
步骤1:发现Host头依赖
- 拦截密码重置请求,观察请求是否包含Host头。
- 修改Host头为攻击者控制的域名(如
evil.com),查看响应是否使用该值生成链接。POST /reset-password HTTP/1.1 Host: evil.com # 篡改此处 Content-Type: application/x-www-form-urlencoded email=victim@example.com - 检查密码重置邮件中的链接是否变为
http://evil.com/reset?token=xxx。
步骤2:构造恶意请求
- 若应用未校验Host头,用户点击邮件链接时会被导向攻击者的服务器,令牌被窃取。
步骤3:组合其他攻击
- 结合XSS或开放重定向,扩大攻击影响。
4. 漏洞根因分析
- 盲目信任用户输入:直接使用Host头生成URL或进行逻辑判断。
- 缺乏服务端校验:未验证Host头是否属于合法域名。
- 配置缺陷:服务器未设置默认域名,允许空或任意Host头。
5. 防护措施
5.1 严格校验Host头(服务端)
- 白名单验证:只允许预设的合法域名,拒绝非法Host头。
# 示例代码(Python Flask) ALLOWED_HOSTS = ['example.com', 'www.example.com'] @app.before_request def check_host(): if request.host not in ALLOWED_HOSTS: abort(400) # 拒绝请求 - 强制使用固定域名:在配置中硬编码域名,避免动态依赖Host头。
5.2 使用绝对路径替代完整URL
- 生成链接时使用相对路径或配置中的基准域名,避免拼接Host头:
<!-- 避免 --> <a href="http://{{Host}}/reset">Reset</a> <!-- 推荐 --> <a href="/reset">Reset</a>
5.3 服务器配置加固
- Web服务器设置:在Nginx/Apache中配置默认域名,拦截非法Host头:
# Nginx配置 server { listen 80 default_server; server_name _; return 444; # 关闭连接 } server { listen 80; server_name example.com; # 正常处理 }
5.4 安全中间件
- 部署WAF(Web应用防火墙)检测异常Host头模式。
6. 测试与验证
- 工具扫描:使用Burp Scanner或Acunetix自动检测Host头漏洞。
- 手动测试:篡改Host头为特殊值(如
127.0.0.1、localhost、空值),观察应用行为。 - 回归测试:修复后重复测试,确认漏洞已消除。
通过以上步骤,可系统性地理解并防御HTTP Host头攻击,确保应用不因盲目信任用户输入而暴露风险。