绿盟漏扫系统漏洞及修复方案

绿盟漏扫系统漏洞及修复方案

漏洞1

在这里插入图片描述

详细描述:

1.X-Content-Type-Options HTTP 消息头相当于一个提示标志,被服务器用来提示客户端一定要遵循在 Content-Type 首部中对 MIME 类型 的设定,而不能对其进行修改。这就禁用了客户端的 MIME 类型嗅探行为,换句话说,也就是意味着网站管理员确定自己的设置没有问题。X-Content-Type-Options响应头的缺失使得目标URL更易遭受跨站脚本攻击。

2.HTTP X-XSS-Protection 响应头是 Internet Explorer,Chrome 和 Safari 的一个特性,当检测到跨站脚本攻击 (XSS)时,浏览器将停止加载页面。X-XSS-Protection响应头的缺失使得目标URL更易遭受跨站脚本攻击。

3.OPTIONS方法是用于请求获得由Request-URI标识的资源在请求/响应的通信过程中可以使用的功能选项。通过这个方法,客户端可以在采取具体资源请求之前,决定对该资源采取何种必要措施,或者了解服务器的性能。OPTIONS方法可能会暴露一些敏感信息,这些信息将帮助攻击者准备更进一步的攻击。

4.Web 服务器对于 HTTP 请求的响应头中缺少 Strict-Transport-Security,这将导致浏览器提供的安全特性失效。 当 Web 服务器的 HTTP 头中包含 Strict-Transport-Security 头时,浏览器将持续使用 HTTPS 来访问 Web 站点,可以用来对抗协议降级攻击和 Cookie 劫持攻击。
其可选的值有: max-age=SECONDS,表示本次命令在未来的生效时间 includeSubDomains,可以用来指定是否对子域名生效 漏洞危害: Web 服务器对于 HTTP 请求的响应头中缺少 Strict-Transport-Security,这将导致浏览器提供的安全特性失效,更容易遭受 Web 前端黑客攻击的影响。

5.Web 服务器对于 HTTP 请求的响应头中缺少 Referrer-Policy,这将导致浏览器提供的安全特性失效。 当用户在浏览器上点击一个链接时,会产生一个 HTTP 请求,用于获取新的页面内容,而在该请求的报头中,会包含一个 Referrer,用以指定该请求是从哪个页面跳转页来的,常被用于分析用户来源等信息。但是也成为了一个不安全的因素,所以就有了 Referrer-Policy,用于过滤 Referrer 报头内容,其可选的项有: no-referrer no-referrer-when-downgrade origin origin-when-cross-origin same-origin strict-origin strict-origin-when-cross-origin unsafe-url 漏洞危害: Web 服务器对于 HTTP 请求的响应头中缺少 Referrer-Policy,这将导致浏览器提供的安全特性失效,更容易遭受 Web 前端黑客攻击的影响。

6.Web 服务器对于 HTTP 请求的响应头中缺少 X-Permitted-Cross-Domain-Policies,这将导致浏览器提供的安全特性失效。 当一些在线的 Web Flash 需要加载其他域的内容时,很多 Web 会通过设置一个 crossdomain.xml 文件的方式来控制其跨域方式。很有可能有些开发者并没有修改 crossdomain.xml 文件的权限,但是又有和跨域的 Flash 共享数据的需求,这时候可以通过设置 X-Permitted-Cross-Domain-Policies 头的方式来替代 crossdomain.xml 文件,其可选的值有: none master-only by-content-type by-ftp-filename all 漏洞危害: Web 服务器对于 HTTP 请求的响应头中缺少 X-Permitted-Cross-Domain-Policies,这将导致浏览器提供的安全特性失效,更容易遭受 Web 前端黑客攻击的影响。

7.Web 服务器对于 HTTP 请求的响应头中缺少 X-Download-Options,这将导致浏览器提供的安全特性失效。 漏洞危害: Web 服务器对于 HTTP 请求的响应头中缺少 X-Download-Options,这将导致浏览器提供的安全特性失效,更容易遭受 Web 前端黑客攻击的影响。

8.HTTP 响应头Content-Security-Policy允许站点管理者控制用户代理能够为指定的页面加载哪些资源。除了少数例外情况,设置的政策主要涉及指定服务器的源和脚本结束点。Content-Security-Policy响应头的缺失使得目标URL更易遭受跨站脚本攻击。

9.点击劫持(ClickJacking)是一种视觉上的欺骗手段。攻击者使用一个透明的、不可见的iframe,覆盖在一个网页上,然后诱使用户在该网页上进行操作,此时用户将在不知情的情况下点击透明的iframe页面。通过调整iframe页面的位置,可以诱使用户恰好点击在iframe页面的一些功能性按钮上。
HTTP 响应头信息中的X-Frame-Options,可以指示浏览器是否应该加载一个 iframe 中的页面。如果服务器响应头信息中没有X-Frame-Options,则该网站存在ClickJacking攻击风险。网站可以通过设置 X-Frame-Options 阻止站点内的页面被其他页面嵌入从而防止点击劫持。

解决方法:

以上漏洞均为http-header(响应头)缺失漏洞,我们可以通过添加一个过滤器来添加相应的响应头,具体代码如下:

@Component
public class AddResponseHeaderFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
       
        response.addHeader("content-test","1234");
        // X-Frame-Options 取值有三种:DENY、SAMEORIGIN、ALLOW-FROM url
        response.addHeader("X-Frame-Options","SAMEORIGIN");
        response.addHeader("Referrer-Policy","origin");
        response.addHeader("Content-Security-Policy", "object-src 'none'");
        response.addHeader("X-Permitted-Cross-Domain-Policies","master-only");
        response.addHeader("X-Content-Type-Options","nosniff");
        response.addHeader("X-XSS-Protection","1; mode=block");
        response.addHeader("X-Download-Options","noopen");
        response.addHeader("Strict-Transport-Security","max-age=63072000; includeSubdomains; preload");
        // 解决安全漏洞:检测到目标服务器启用了OPTIONS方法
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS");
        response.setHeader("Access-Control-Max-Age", "86400");
        response.setHeader("Access-Control-Allow-Headers", "*");
        // 如果是OPTIONS则结束请求
        if (HttpMethod.OPTIONS.toString().equals(httpServletRequest.getMethod())) {
            response.setStatus(HttpStatus.NO_CONTENT.value());
        }
        //加入过滤链
        filterChain.doFilter(httpServletRequest,response);

    }
}

漏洞2

在这里插入图片描述

详细描述:

jQuery是美国John Resig程序员的一套开源、跨浏览器的JavaScript库。 jQuery 大于或等于1.2.0至3.5.0的版本中存在跨站脚本漏洞,该漏洞源于WEB应用缺少对客户端数据的正确验证。即使执行sanitize处理,也仍会执行将来自不受信任来源的HTML传递给jQuery的DOM操作方法(即html()、.append()等),攻击者可利用该漏洞执行客户端代码。

漏洞原理可参考以下链接:https://mp.weixin.qq.com/s/QW5v5d7829m0Pz6AA6_XPQ

解决方法:

更新jQuery版本至3.5.0以上,但是更新jQuery会导致我们的应用出现问题,因为高版本jQuery会弃用很多低版本的函数,这是我们可以同时引入官方提供的应用迁移辅助插件jQuery-migrate,下载最新版本插件以解决上述问题,附下载链接如下。

jQuery下载:https://jquery.com/download/

jQuery-migrate下载:https://www.bootcdn.cn/jquery-migrate/

漏洞3

在这里插入图片描述

详细描述:

Spambot 搜寻因特网站点,开始查找电子邮件地址来构建发送自发电子邮件(垃圾邮件)的邮件列表。如果检测到含有一或多个电子邮件地址的响应,可供利用以发送垃圾邮件。而且,找到的电子邮件地址也可能是专用电子邮件地址,对于一般大众应是不可访问的。

解决方法:

将我们代码内出现的真实电子邮箱去掉,包括注释在内的,如下代码所示:

/*
 * JQuery zTree core v3.5.16
 * http://zTree.me/
 *
 * Copyright (c) 2010 Hunter.z
 *
 * Licensed same as jquery - MIT License
 * http://www.opensource.org/licenses/mit-license.php
 *
 * email: hunter.z@263.net
 * Date: 2014-03-09
 */

漏洞4

在这里插入图片描述

详细描述:

Cookie通常由Web服务器创建并存储在客户端浏览器中,用来在客户端保存用户的身份标识、Session信息,甚至授权信息等。客户端JavaScript代码可以操作Cookie数据。如果在客户端使用JavaScript创建或修改站点的cookie,那么攻击者就可以查看到这些代码,通过阅读代码了解其逻辑,甚至根据自己所了解的知识将其用来修改cookie。一旦cookie包含了很重要的信息,譬如包含了权限信息等,攻击者很容易利用这些漏洞进行特权升级等攻击。

解决方法:

在前文漏洞1过滤器的基础上,添加处理cookie问题代码,过滤所有请求,即可解决问题。

@Component
public class AddResponseHeaderFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
       
        response.addHeader("content-test","1234");
        // X-Frame-Options 取值有三种:DENY、SAMEORIGIN、ALLOW-FROM url
        response.addHeader("X-Frame-Options","SAMEORIGIN");
        response.addHeader("Referrer-Policy","origin");
        response.addHeader("Content-Security-Policy", "object-src 'none'");
        response.addHeader("X-Permitted-Cross-Domain-Policies","master-only");
        response.addHeader("X-Content-Type-Options","nosniff");
        response.addHeader("X-XSS-Protection","1; mode=block");
        response.addHeader("X-Download-Options","noopen");
        response.addHeader("Strict-Transport-Security","max-age=63072000; includeSubdomains; preload");
        // 解决安全漏洞:检测到目标服务器启用了OPTIONS方法
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS");
        response.setHeader("Access-Control-Max-Age", "86400");
        response.setHeader("Access-Control-Allow-Headers", "*");
        // 如果是OPTIONS则结束请求
        if (HttpMethod.OPTIONS.toString().equals(httpServletRequest.getMethod())) {
            response.setStatus(HttpStatus.NO_CONTENT.value());
        }
        //处理cookie问题
        Cookie[] cookies = httpServletRequest.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                String value = cookie.getValue();
                StringBuilder builder = new StringBuilder();
                builder.append(cookie.getName()+"="+value+";");
                builder.append("Secure;");//Cookie设置Secure标识
                builder.append("HttpOnly;");//Cookie设置HttpOnly
                res.addHeader("Set-Cookie", builder.toString());
            }
        }
        //加入过滤链
        filterChain.doFilter(httpServletRequest,response);
    }
}

漏洞5

在这里插入图片描述

详细描述:

检测到目标应用程序使用HTTP连接接受客户端的登录请求,如果登录请求数据没有加密处理,有可能被攻击者嗅探到客户端提交的请求数据,请求数据中一般包含用户名和密码,导致信息泄露。本漏洞属于Web应用安全常见漏洞。

解决方法:

使用HTTPS连接发送登录请求数据。具体实现方法如下:

1.生成证书

打开生成证书位置的目录,在视图框输入cmd。

在这里插入图片描述

2.在小黑框输入以下命令,回车

keytool -genkeypair -alias "boot" -keyalg "RSA" -keystore "seek.keystore"

3.输入命令秘钥,我这里输入的是123456,你是看不到你输入的内容的

在这里插入图片描述

4…再次输入秘钥:123456

在这里插入图片描述

5.接着一步步输入信息,最后是否确认输入Y,点击回车

在这里插入图片描述

6.再2次输入秘钥口令:123456

在这里插入图片描述

7.将生成的证书放到resources目录下

在这里插入图片描述

8.在项目applicaion.properties或者applicaion.yml配置类中配置一下信息

server.port=8084
server.ssl.key-store= classpath:seek.keystore
server.ssl.key-store-password=123456
server.ssl.keyStoreType=jks
server.ssl.keyAlias=boot

9.在前端页面统一引入以下标签启用https:

<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">

10.在springboot的启动类中添加如下代码:

   /**
     * it's for set http url auto change to https
     */
    @Bean
    public TomcatServletWebServerFactory servletContainer() { //springboot2 新变化

        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {

            @Override
            protected void postProcessContext(Context context) {

                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        tomcat.addAdditionalTomcatConnectors(initiateHttpConnector());
        return tomcat;
    }

    private Connector initiateHttpConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(8080);
        connector.setSecure(false);
        connector.setRedirectPort(8084);
        return connector;
    }

漏洞6

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CXRrUZQp-1645236603199)(C:\Users\DEFT\Desktop\房产经营管理系统\房产经营管理系统漏洞报告及解决方案\6.png)]

详细描述:

缓慢的HTTP拒绝服务攻击是一种专门针对于Web的应用层拒绝服务攻击,攻击者操纵网络上的肉鸡,对目标Web服务器进行海量HTTP请求攻击,直到服务器带宽被打满,造成了拒绝服务。慢速HTTP拒绝服务攻击经过不断的演变和发展,主要有三种攻击类型,分别是Slow headers、Slow body、Slow read。以Slow headers为例,Web应用在处理HTTP请求之前都要先接收完所有的HTTP头部,因为HTTP头部中包含了一些Web应用可能用到的重要的信息。攻击者利用这点,发起一个HTTP请求,一直不停的发送HTTP头部,消耗服务器的连接和内存资源。抓包数据可见,攻击客户端与服务器建立TCP连接后,每10秒才向服务器发送一个HTTP头部,而Web服务器在没接收到2个连续的\r\n时,会认为客户端没有发送完头部,而持续的等等客户端发送数据。如果恶意攻击者客户端持续建立这样的连接,那么服务器上可用的连接将一点一点被占满,从而导致拒绝服务。这种攻击类型称为慢速HTTP拒绝服务攻击。

解决方法:

在项目applicaion.properties或者applicaion.yml配置类中配置以下信息

server:
  ...
  tomcat:
    max-connections: 10000 # 最大连接数
  connection-timeout: 1000 # 连接超时

漏洞7

在这里插入图片描述

详细描述:

为了方便的获得网站域名,开发人员一般依赖于HTTP Host header。例如,在php里用_SERVER[“HTTP_HOST”]。但是这个header是不可信赖的,如果应用程序没有对host header值进行处理,就有可能造成恶意代码的传入。

解决方法及验证过程:

经过查询相关资料,该漏洞解决主要分为两种方式:

1.如果项目tomcat服务器引入的外部tomcat,修改tomcat配置文件server.xml添加访问IP白名单即可

在这里插入图片描述

2.如果是内嵌的tomcat,比如springboot项目,可以选择如下方法添加过滤器(过滤器仍旧使用漏洞一所用过滤器,添加部分代码即可):

import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Component
public class AddResponseHeaderFilter extends OncePerRequestFilter {
    //判断主机是否存在白名单中
    private boolean checkBlankList(String host){
        /*
       //这一段是用来检测是否有端口,如有去掉端口(根据自己需求看是否要加上)
       if (host.contains(":")){
            host = host.substring(0,host.indexOf(":"));
        }
        */
        //这里host有时候会包括项目端口号,下面白名单IP可以写成一个集合,看集合是否包含当前访问IP
        if (host.contains("换成您的ip地址")||host.contains("换成您的ip地址")){
            return true;
        }
        return false;
    }

    @Override
    protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        // 头攻击检测  过滤主机名
        if (httpServletRequest.getMethod().equals("POST")){
            System.out.println("POST==================================================");
        }
        String requestHost = httpServletRequest.getHeader("host");
        if (requestHost != null && !checkBlankList(requestHost)) {
            response.setStatus(403);
            return;
        }
        filterChain.doFilter(httpServletRequest,response);

    }
}

此时不在我们主机白名单内的host访问将会被拒绝,下面我们修改host进行测试:

1.修复前测试:使用burpsuite软件抓包测试,打开软件后访问我们的测试站点,ip为180.201.151.125,端口号为8084

在这里插入图片描述

修改host后:
在这里插入图片描述

2.修复后测试:
在这里插入图片描述

修改host后:

在这里插入图片描述

此时我们自然以为大功告成,漏洞已经修复,但是实际结果却不尽人意,经过绿盟扫描后仍然检测存在该漏洞!

由于漏洞主要发现于登录请求中,我们想到之前测试并没有加参数,也就是登陆页面所需要的账号密码,因此我们测试加上账号密码参数如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gfeaeq3e-1645236603202)(C:\Users\DEFT\AppData\Roaming\Typora\typora-user-images\image-20211227144851909.png)]

然后我们修改host继续测试:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KJnBnlaT-1645236603202)(C:\Users\DEFT\AppData\Roaming\Typora\typora-user-images\image-20211227145019814.png)]

经过以上测试,说明我们的项目仍然存在该漏洞,经过debug以及日志打印,我们发现设定的过滤器并没有对登录请求生效,登录请求为POST请求:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-StvK51nf-1645236603202)(C:\Users\DEFT\AppData\Roaming\Typora\typora-user-images\image-20211227145213289.png)]

因此,回到项目处理登录请求的部分,项目为springboot项目,使用了spring security进行登录鉴权,因此登陆请求是由spring security来完成的,因此我们猜测我们添加的过滤器在spring security内部并没有生效,按照该思路查阅spring security内部是否存在相关过滤器,经查询,spring security内部存在一条过滤链,在我们启动项目时会打印出来,过滤链如下:

Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@608aed14, org.springframework.security.web.context.SecurityContextPersistenceFilter@f76ba38, org.springframework.security.web.header.HeaderWriterFilter@757eee91, org.springframework.security.web.authentication.logout.LogoutFilter@69e19cb, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@3386990d, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@5e6e4341, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@7e2986c0, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@27098668, org.springframework.security.web.session.SessionManagementFilter@73edeae3, org.springframework.security.web.access.ExceptionTranslationFilter@50a23426, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@6b53f420]

可以看到过滤链中有一个过滤器名称为UsernamePasswordAuthenticationFilter,从名称就可以看出这是处理用户名和密码的过滤链,我们将前面自定义的过滤器添加到该过滤器中,添加方式如下:

import org.springframework.context.annotation.Configuration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
import org.springframework.security.web.firewall.HttpFirewall;
import org.springframework.security.web.firewall.StrictHttpFirewall;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@EnableWebSecurity
@Configuration
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.addFilterBefore(new AddResponseHeaderFilter(), UsernamePasswordAuthenticationFilter.class);
                .authorizeRequests()
                .anyRequest()
                .permitAll();

}

然后我们重新抓包测试:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hNhRVVUE-1645236603203)(C:\Users\DEFT\AppData\Roaming\Typora\typora-user-images\image-20211227150501240.png)]

重新使用扫描器扫描后漏洞修复完成!

附: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)

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值