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();
相關文章
相關標籤/搜索