Java Web專案漏洞:檢測到目標URL存在http host頭攻擊漏洞解決辦法
阿新 • • 發佈:2018-12-31
背景
專案上線之後使用綠盟或Acunetix安全掃描工具掃描後發現了頭攻擊漏洞。截圖如下:
漏洞提示
檢測工具在檢測出漏洞後給予的提示為:
大意為不要使用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 && !ServerWhiteListUtil.isWhite(requestHost)) {
response.setStatus(403 );
return;
}
...
}
}
上述程式碼是常見的web系統攔截器doFilter方法,我們在方法開始的地方做host判定,如果不在白名單內,則返回403狀態碼。漏洞工具收到403後認為訪問請求已被終止,就不會報錯了。
其中,ServerWhiteListUtil.isWhite(requestHost))方法:
package ...;
import java.io.InputStreamReader;
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
/**
* 伺服器白名單列表
*/
public class ServerWhiteListUtil {
private static List<String> whiteList = null;;
static {
try {
// 讀取白名單列表
whiteList = new Gson().fromJson(
new InputStreamReader(ServerWhiteListUtil.class.getResourceAsStream("/serverWhiteList.json")),
new TypeToken<List<String>>() {
}.getType());
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 判斷當前host是否在白名單內
* @param host 待查host
* @return boolean 是否在白名單內
*/
public static boolean isWhite(String host) {
if (whiteList == null || whiteList.size() == 0) {
return true;
}
for (String str : whiteList) {
if (str != null && str.equals(host)) {
return true;
}
}
return false;
}
}
配置項serverWhiteList.json檔案(放置在src根目錄或resource配置目錄,根據專案框架來定):
[
"www.aaa.com:78",
"www.bbb.com:178"
]