针对Tomcat7的HTTP Host头攻击漏洞修复,需结合配置调整、请求校验和应用层防护,以下是具体方案:


一、Tomcat配置修复

  1. 限制Host头匹配范围
    server.xml中修改<Host>节点的name属性,指定允许的合法域名或IP地址,避免使用localhost
<Host name="192.168.1.100" appBase="webapps" unpackWARs="true" autoDeploy="true">

• 作用:仅允许请求头中Host值为192.168.1.100的流量被处理,其他请求会被Tomcat拒绝。


  1. 设置默认无效主机
    修改
    <Engine>标签的defaultHost为不存在的域名(如forbidden):
<Engine name="Catalina" defaultHost="forbidden">

• 作用:未匹配到任何<Host>的请求会被导向forbidden主机,触发403错误。


二、请求拦截过滤器(Filter)
在应用层添加过滤器,校验
Host头合法性:

  1. 配置web.xml
<filter>
    <filter-name>HostValidationFilter</filter-name>
    <filter-class>com.example.HostValidationFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>HostValidationFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

• 注意:过滤器需配置为第一个执行,确保所有请求被拦截。


  1. 实现过滤器逻辑
public class HostValidationFilter implements Filter {
    private static final Set<String> ALLOWED_HOSTS = new HashSet<>(Arrays.asList(
        "192.168.1.100:8080", "www.example.com:8080"
    ));

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        String hostHeader = httpRequest.getHeader("Host");

        if (hostHeader == null || !ALLOWED_HOSTS.contains(hostHeader)) {
            ((HttpServletResponse) response).sendError(HttpServletResponse.SC_FORBIDDEN, "Invalid Host");
            return;
        }
        chain.doFilter(request, response);
    }
}

• 逻辑:检查Host头是否在白名单中,否则返回403。


三、应用代码修复

  1. 避免直接使用request.getHeader("Host")
    在JSP或Servlet中,改用静态配置的域名或IP生成URL:
// 错误示例(依赖Host头)
String url = request.getHeader("Host") + "/path";

// 正确示例(静态配置)
String host = "192.168.1.100:8080"; // 从配置文件读取
String url = host + "/path";

• 原理:防止攻击者通过篡改Host头注入恶意域名。


  1. 使用相对路径
    生成链接时优先使用相对路径,避免拼接完整URL:
<a href="/user/profile">个人中心</a> <!-- 安全 -->
<a href="${host}/user/profile">个人中心</a> <!-- 高风险 -->


四、反向代理增强防护(可选)
若Tomcat部署在Nginx/Apache后端,可通过反向代理拦截非法请求:

  1. Nginx配置示例
server {
    listen 80;
    server_name 192.168.1.100;  # 仅允许该域名
    if ($http_host !~* ^(192\.168\.1\.100|www\.example\.com)$) {
        return 403;
    }
    location / {
        proxy_pass http://localhost:8080;
    }
}

• 作用:前端拦截非法Host头,减少后端压力。


五、验证与测试

  1. BurpSuite测试
    修改请求头Host为非法值(如evil.com),观察Tomcat是否返回403。
  2. CURL命令测试
curl -H "Host: evil.com" http://192.168.1.100:8080

• 预期结果:返回403 Forbidden。


六、其他注意事项
• 禁用不必要的HTTP方法:如
TRACE,避免反射攻击。

• 日志监控:记录所有非法Host请求,便于审计。

• 升级Tomcat版本:Tomcat 8.5+默认对Host头校验更严格,建议升级。


通过以上多层级防护,可有效防御Host头攻击,确保应用安全性。