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头部中的:php

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

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

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

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后认为访问请求已被终止,就不会报错了。tomcat

 

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();
相关文章
相关标签/搜索