针对Tomcat7的HTTP Host头攻击漏洞修复,需结合配置调整、请求校验和应用层防护,以下是具体方案:
一、Tomcat配置修复
- 限制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拒绝。
- 设置默认无效主机
修改<Engine>
标签的defaultHost
为不存在的域名(如forbidden
):
<Engine name="Catalina" defaultHost="forbidden">
• 作用:未匹配到任何<Host>
的请求会被导向forbidden
主机,触发403错误。
二、请求拦截过滤器(Filter)
在应用层添加过滤器,校验Host
头合法性:
- 配置
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>
• 注意:过滤器需配置为第一个执行,确保所有请求被拦截。
- 实现过滤器逻辑
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。
三、应用代码修复
- 避免直接使用
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头注入恶意域名。
- 使用相对路径
生成链接时优先使用相对路径,避免拼接完整URL:
<a href="/user/profile">个人中心</a> <!-- 安全 -->
<a href="${host}/user/profile">个人中心</a> <!-- 高风险 -->
四、反向代理增强防护(可选)
若Tomcat部署在Nginx/Apache后端,可通过反向代理拦截非法请求:
- 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头,减少后端压力。
五、验证与测试
- BurpSuite测试
修改请求头Host
为非法值(如evil.com
),观察Tomcat是否返回403。 - CURL命令测试
curl -H "Host: evil.com" http://192.168.1.100:8080
• 预期结果:返回403 Forbidden。
六、其他注意事项
• 禁用不必要的HTTP方法:如TRACE
,避免反射攻击。
• 日志监控:记录所有非法Host请求,便于审计。
• 升级Tomcat版本:Tomcat 8.5+默认对Host头校验更严格,建议升级。
通过以上多层级防护,可有效防御Host头攻击,确保应用安全性。