美文网首页
WEB项目的HTTP HEADER常见的安全漏洞

WEB项目的HTTP HEADER常见的安全漏洞

作者: 搞桑儿 | 来源:发表于2021-03-12 22:06 被阅读0次

    WEB项目中有些常见的漏洞,是大家都没注意到或者不了解的。

    这里梳理一些常见的漏洞,给大家做说明与提供一套解决方案。

    - 检测到目标X-Content-Type-Option响应头缺失

    - 检测到目标X-XSS-Protection响应头缺失

    - 检测到目标Content-Security-Policy响应头

    - 检测到目标URL存在HTTP host头攻击漏洞

    - 检测到目标URL启用了不安全的HTTP方法

    - 检测到目标主机可能存在缓慢的HTTP拒绝服务攻击

    ---

    ## 1. 检测到目标X-Content-Type-Options响应头缺失

    > X-Content-Type-Options HTTP消息头相当于一个提示标志,被服务器用来提示客户端一定要遵循在Content-Type首部中对[MIME](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types)类型的设定,而不能对其进行修改。这就禁用了客户端的MIME类型嗅探行为,换句话说,也就是意味着网站管理员确定自己的设置没有问题。

    ### 解决方案

    此类问题事实上是要阻止浏览器对MIME的嗅探行为。当MIME的类型缺失浏览器会通过查看资源对MIME进行嗅探,而这个操作可能涉及安全问题。所以我们应该尽量的设置MIME类型,然后禁用MIME嗅探的行为。

    1. 设置response响应报文头

    2. 添加X-Content-Type-Options字段,并设值为“nosniff"

    ```java

    @Override 

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 

        HttpServletRequest request = (HttpServletRequest) servletRequest; 

    HttpServletResponse response = (HttpServletResponse) servletResponse; 

    response.addHeader("X-Content-Type-Options","nosniff"); 

    filterChain.doFilter(request,response); 

    }

    ```

    ---

    ## 2. 检测到目标X-XSS-Protection响应头缺失

    > HTTP [X-XSS-Protection](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection)响应头是Internet Explorer,Chrome和Safari的一个特性,当检测到跨站脚本攻击(XSS)时,浏览器将停止加载页面。

    ### 解决方案

    XSS的攻击防御其实涉及很多方面的修改,这里我们不详述。我们可以先通过启用XSS过滤来做基本的防御。

    配置说明

    - 0:禁用XSS

    - 1:启动XSS;mode= block:检测到攻击,浏览器将阻止页面的呈现,而不是过滤页面中的XSS内容;report=\<reporting-url\>,仅限chrome,检测到攻击后,将报告行为至指定的服务。

    1. 设置ersponse响应报文头

    2. 添加X-XSS-Protection字段,并设为"1;mode=block"

    ```java

    @Override 

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 

        HttpServletRequest request = (HttpServletRequest) servletRequest; 

    HttpServletResponse response = (HttpServletResponse) servletResponse;   

    response.addHeader("X-XSS-Protection","1;mode=block");

    filterChain.doFilter(request,response); 

    }

    ```

    ---

    ## 3. 检测到目标Content-Security-Policy响应头

    >HTTP响应头Content-Security-Policy允许站点管理者控制用户代理能够为指定的页面加载哪些资源.除少数例外情况,设置的政策主要涉及指定服务器的源和脚本结束点.

    ### 解决方案

    ```java

    @Override 

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 

        HttpServletRequest request = (HttpServletRequest) servletRequest; 

    HttpServletResponse response = (HttpServletResponse) servletResponse; 

    response.addHeader("Content-Security-Policy","default-src 'self");

    filterChain.doFilter(request,response); 

    }

    ```

    ---

    ## 4. 检测到目标URL存在HTTP host头攻击漏洞

    > 为了方便的获得网站域名,开发人员一般依赖于HTTP Host header。但是这个header时不可信赖的,如果应用程序没有对host header值进行处理,就有可能造成而已代码的传入。

    ### 解决方案

    对此为WEB项目的host进行管理,通过设置白名单的方式规定可访问的域名。

    1. 设置拦截器,获取报文头的host字段。

    2. 配置拦截器的白名单。

    ```java

    private static final String[] HOST_LIST = {"127.0.0.1","localhost","0.0.0.0"}; 

    @Override 

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 

        HttpServletRequest request = (HttpServletRequest) servletRequest; 

    HttpServletResponse response = (HttpServletResponse) servletResponse; 

    String host = response.getHeader("host"); 

    if(!checkBlankList(host)){ 

            response.setStatus(HttpStatus.FORBIDDEN.value()); 

    return;

    }

    filterChain.doFilter(request,response);

    private boolean checkBlankList(String host){ 

        boolean isAllow = false; 

    if(host == null){ 

        isAllow = true; 

    }

    for (String blankHost : HOST_LIST){ 

        if(blankHost.contains(host)){ 

            isAllow = true; 

        } 

        return isAllow; 

    }

    ```

    ---

    ## 5. 检测到目标URL启用了不安全的HTTP方法

    > 检测到目标WEB服务器配置成允许下列其中一个(或多个)HTTP方法:DELETE,SEARCH,COPY,MOVE,PROPFIND,PROPPATCH,MKCOL,LOCK,UNLOCK。

    > 这些方法表示可能在服务器上使用了WebDAV。由于dav方法允许客户端操纵服务器上的文件,如果没有合理配置dav,有可能允许未授权的用户对其进行利用,修改服务器上的文件。

    ### 解决方案

    配置所能接收的请求方法,一般配置为POST、GET两个方法就够了,有其他需求的就加上

    ```java

    @Override 

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 

    HttpServletRequest request = (HttpServletRequest) servletRequest; 

    HttpServletResponse response = (HttpServletResponse) servletResponse; 

    if(!isAllowMethod(request)){ 

    response.setStatus(HttpStatus.NOT\_FOUND.value()); 

    return;

    filterChain.doFilter(request,response); 

    }

    private boolean isAllowMethod(HttpServletRequest request){ 

    boolean isAllow = false; 

    String method = request.getMethod(); 

    if(HttpMethod.GET.toString().equals(method)|| HttpMethod.POST.toString().equals(method)){ 

    isAllow = true; 

    return isAllow; 

    }

    ```

    ---

    ## 6. 检测到目标主机可能存在缓慢的HTTP拒绝服务攻击

    > 缓慢的HTTP拒绝服务攻击时一种专门针对Web的应用层拒绝服务攻击,攻击者操纵网络上的肉鸡,对目标Web服务器进行海量HTTP请求攻击,直到服务器带宽被打满,造成了拒绝服务。

    ### 解决方案

    此类问题一般从两个方向解决:1,规定请求的连接并发数;2,设置请求超时时间。

    ```properties

    server.connection-timeout= 5000

    server.tomcat.max-connections = 10000

    ```

    ---

    ## 7. 点击劫持:X-Frame-Options未配置

    >点击劫持是一种视觉上的欺骗手段。攻击者使用一个透明的、不可见的iframe,覆盖在一个网页上,然后诱使用户在该网页上进行操作,此时用户将在不知情的情况下点击透明的iframe页面。通过调整iframe页面的位置,可以诱使用户恰好点击在iframe页面的一些功能性按钮上。

    ### 解决方案

    1. 添加X-Frame-Options响应头

    - DENY:不能被嵌入。

    - SAMEORIGIN:只能嵌入本站。

    - ALLOW-FROM:指定能嵌入的站点

    2. 设置response的响应头

    ```java

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 

        HttpServletRequest request = (HttpServletRequest) servletRequest; 

    HttpServletResponse response = (HttpServletResponse) servletResponse; 

    //response.addHeader("X-frame-options","DENY"); 

    //response.addHeader("X-frame-options","SAMEORIGIN"); 

    response.addHeader("X-frame-options","ALLOW-FROM 'http://localhost:9080'"); 

    filterChain.doFilter(request,response); 

    }

    ```

    相关文章

      网友评论

          本文标题:WEB项目的HTTP HEADER常见的安全漏洞

          本文链接:https://www.haomeiwen.com/subject/xsktcltx.html