Java Web项目漏洞:检测到目标URL存在http host头攻击漏洞解决办法

时间:2023-03-09 02:47:52
Java Web项目漏洞:检测到目标URL存在http host头攻击漏洞解决办法
Java Web项目漏洞:检测到目标URL存在http host头攻击漏洞解决办法Java Web项目漏洞:检测到目标URL存在http host头攻击漏洞解决办法检测到目标URL存在http host头攻击漏洞
详细描述 为了方便的获得网站域名,开发人员一般依赖于HTTP Host header。例如,在php里用_SERVER["HTTP_HOST"]。但是这个header是不可信赖的,如果应用程序没有对host header值进行处理,就有可能造成恶意代码的传入。
解决办法 web应用程序应该使用SERVER_NAME而不是host header。 在Apache和Nginx里可以通过设置一个虚拟机来记录所有的非法host header。在Nginx里还可以通过指定一个SERVER_NAME名单,Apache也可以通过指定一个SERVER_NAME名单并开启UseCanonicalName选项。
威胁分值 5
危险插件
发现日期 2008-06-12
CVSS评分 6.1(CVSS:3.0/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N)

大意为不要使用request中的serverName,也就是说host header可能会在攻击时被篡改,依赖request的方法是不可靠的,形如JSP头部中的:

String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

这样的使用方法就会被漏洞检测工具查出来,认定有头攻击漏洞。

解决办法
提示中说,如果是php的话不要用SERVER_NAME,apache和Nginx通过设置虚拟机来纪要非法header,而web开发中常见的运行容器就是tomcat,网络查找出的解决方案大多不适用,最后,我们找到了一个折中的办法。
主要解决办法,就是在请求拦截上面做host合法性校验,拦截掉非法请求。

public class SessionFilter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException,
ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res; // 头攻击检测
String requestHost = request.getHeader("host");
if (requestHost != null && !checkBlankList(requestHost)) {
response.setStatus(403);
return;
}
...
}
}
private boolean checkBlankList(String host){
if(host.contains("10.160.79.")){
return true;
}
return false;
}

上述代码是常见的web系统拦截器doFilter方法,我们在方法开始的地方做host判定,如果不在白名单内,则返回403状态码。漏洞工具收到403后认为访问请求已被终止,就不会报错了。

ps:附上一些代码:

// 头攻击检测
String requestHost = request.getHeader("host");
也可以尝试
req.getHeader("Host");//大小写是否有关系我未验证
req.getRemoteHost();//返回Ip
public String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
req.getRemoteHost();