【漏洞】
检测到目标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() { } }