![]() ![]() |
||||||||||||
|
大意爲不要使用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();