• 【漏洞一】检测到目标URL存在http host头攻击漏洞


    漏洞

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

      

  • 相关阅读:
    注释代码片段
    更新docker时间-需要重启docker
    mysql随机查询若干条数据的方法
    Linux 块设备驱动 (一)
    Linux SD/MMC/SDIO驱动分析
    【转】Alsa音频编程【精华】
    goahead webserver源码分析
    【转】Linux系统调用列表
    Arm Linux系统调用流程详细解析
    Socket 相关的知识
  • 原文地址:https://www.cnblogs.com/651434092qq/p/11506904.html
Copyright © 2020-2023  润新知