【漏洞】
檢測到目標URL存在http host頭攻擊漏洞
【原因】
在項目中使用了 request.getServerName 導致漏洞的出現
不要使用request中的serverName,也就是說host header可能會在攻擊時被篡改,依賴request的方法是不可靠的,形如JSP頭部中的:
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
這樣的使用方法就會被漏洞檢測工具查出來,認定有頭攻擊漏洞。
【解決】添加過濾器,使用白名單解決。
附:http狀態碼
200 OK //客戶端請求成功
400 Bad Request //客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized //請求未經授權,這個狀態代碼必須和WWW-Authenticate報頭域一起使用
403 Forbidden //服務器收到請求,但是拒絕提供服務
404 Not Found //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error //服務器發生不可預期的錯誤
503 Server Unavailable //服務器當前不能處理客戶端的請求,一段時間后可能恢復正常
eg:HTTP/1.1 200 OK (CRLF)
1、web.xml加過濾器
<filter> <filter-name>hostCleanFilter</filter-name> <filter-class>HostCleanFilter</filter-class> </filter> <filter-mapping> <filter-name>hostCleanFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
2、過濾器實現
import org.apache.commons.lang.StringUtils; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class HostCleanFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; String requestHost = request.getHeader("host"); if (requestHost != null && isRightHost(requestHost)){ response.setStatus(403); return; } chain.doFilter(request,response); } public boolean isRightHost(String requestHost){ if (!StringUtils.equals(requestHost,"X.X.X.X:8080") &&!StringUtils.equals(requestHost,"A.A.A.A")){ //域名非法 return true; } return false; } public void destroy() { } }