Host-header-injection
字数 1183 2025-08-29 08:32:09

Host Header Injection 漏洞分析与防御指南

0x01 漏洞原理

Host Header Injection(主机头注入)是一种由于服务器对Host头部处理不当而导致的安全漏洞。其核心原理如下:

  1. HTTP Host头部的作用:在共享主机环境下,一个Web服务器通常托管多个网站,Host头部用于区分客户端请求的是哪个网站。

  2. 漏洞产生原因:当服务器直接信任并使用了客户端提供的Host头部值,而没有进行适当的验证和过滤时,就可能产生安全问题。

  3. 典型漏洞代码示例

<a href="http://<?php echo $_SERVER['HOST'] ?>">Redirect</a>

这段代码直接使用了$_SERVER['HOST'](可通过HTTP请求修改)来构建重定向链接,存在安全隐患。

0x02 黑盒测试方法

测试步骤

  1. 直接修改Host头部

    GET / HTTP/1.1
    Host: malicious.com
    
  2. 参数污染技术

    GET / HTTP/1.1
    Host: example.com
    Host: malicious.com
    
  3. 使用伪造请求头

    GET / HTTP/1.1
    Host: example.com
    X-Forwarded-For: malicious.com
    

测试用例

  1. 观察服务器响应中是否直接使用了提供的Host值
  2. 检查是否有基于Host头部的重定向行为
  3. 验证是否有缓存机制会受到Host头部影响

0x03 漏洞危害

1. 缓存投毒 (Cache Poisoning)

攻击流程:

  1. 正常访问example.com
  2. 服务器返回302跳转到https://www.example.com/login
  3. 修改请求头Host为malicious.com
  4. 服务器返回302跳转到https://www.malicious.com/login
  5. 后续用户访问example.com时可能被直接跳转到恶意网站

2. 开放重定向 (Open Redirection)

通过修改Host头部,攻击者可构造恶意重定向链接:

HTTP/1.1 302 Found
Location: http://malicious.com

3. CRLF注入

利用Host头部注入CRLF(回车换行)字符:

Host: example.com%0d%0aSet-Cookie:test=true;

可能导致HTTP响应头注入,设置恶意cookie等。

4. 密码重置劫持

攻击流程:

  1. 正常密码重置链接:http://www.example.com/Token/
  2. 修改Host为malicious.com
  3. 用户收到的重置链接变为:http://www.malicious.com/Token/
  4. 用户点击后,攻击者可从服务器日志获取Token

0x04 修复方案

1. Host白名单验证

$allowed_hosts = ['example.com', 'www.example.com'];
if (!in_array($_SERVER['HTTP_HOST'], $allowed_hosts)) {
    die("Invalid Host header");
}

2. 获取真实Host

  • 配置Web服务器只响应特定的Host
  • 在Nginx中:
server {
    listen 80;
    server_name example.com www.example.com;
    if ($host !~* ^(example.com|www.example.com)$ ) {
        return 444;
    }
    ...
}

3. 其他防御措施

  1. 避免直接使用Host头部构建URL或重定向
  2. 对用户提供的Host值进行严格验证和过滤
  3. 使用SERVER_NAME代替HTTP_HOST(但需注意其可能受服务器配置影响)
  4. 实施严格的CRLF过滤

总结

Host Header Injection是一种由于服务器过度信任客户端提供的Host头部而导致的安全漏洞,可能导致缓存投毒、开放重定向、CRLF注入和密码重置劫持等多种攻击。通过实施Host白名单、严格验证用户输入和正确配置服务器,可以有效防御此类漏洞。

Host Header Injection 漏洞分析与防御指南 0x01 漏洞原理 Host Header Injection(主机头注入)是一种由于服务器对Host头部处理不当而导致的安全漏洞。其核心原理如下: HTTP Host头部的作用 :在共享主机环境下,一个Web服务器通常托管多个网站,Host头部用于区分客户端请求的是哪个网站。 漏洞产生原因 :当服务器直接信任并使用了客户端提供的Host头部值,而没有进行适当的验证和过滤时,就可能产生安全问题。 典型漏洞代码示例 : 这段代码直接使用了 $_SERVER['HOST'] (可通过HTTP请求修改)来构建重定向链接,存在安全隐患。 0x02 黑盒测试方法 测试步骤 直接修改Host头部 : 参数污染技术 : 使用伪造请求头 : 测试用例 观察服务器响应中是否直接使用了提供的Host值 检查是否有基于Host头部的重定向行为 验证是否有缓存机制会受到Host头部影响 0x03 漏洞危害 1. 缓存投毒 (Cache Poisoning) 攻击流程: 正常访问example.com 服务器返回302跳转到 https://www.example.com/login 修改请求头Host为malicious.com 服务器返回302跳转到 https://www.malicious.com/login 后续用户访问example.com时可能被直接跳转到恶意网站 2. 开放重定向 (Open Redirection) 通过修改Host头部,攻击者可构造恶意重定向链接: 3. CRLF注入 利用Host头部注入CRLF(回车换行)字符: 可能导致HTTP响应头注入,设置恶意cookie等。 4. 密码重置劫持 攻击流程: 正常密码重置链接: http://www.example.com/Token/ 修改Host为malicious.com 用户收到的重置链接变为: http://www.malicious.com/Token/ 用户点击后,攻击者可从服务器日志获取Token 0x04 修复方案 1. Host白名单验证 2. 获取真实Host 配置Web服务器只响应特定的Host 在Nginx中: 3. 其他防御措施 避免直接使用Host头部构建URL或重定向 对用户提供的Host值进行严格验证和过滤 使用SERVER_ NAME代替HTTP_ HOST(但需注意其可能受服务器配置影响) 实施严格的CRLF过滤 总结 Host Header Injection是一种由于服务器过度信任客户端提供的Host头部而导致的安全漏洞,可能导致缓存投毒、开放重定向、CRLF注入和密码重置劫持等多种攻击。通过实施Host白名单、严格验证用户输入和正确配置服务器,可以有效防御此类漏洞。