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();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM