Spring Boot存在路径遍历漏洞CVE-2021-22118的问题解析

 更新时间:2023年09月01日 15:02:40   作者:冰点.  
CVE-2021-22118 是一个在 Spring Boot 中发现的漏洞,该漏洞关系到 Spring Boot 的开发者工具(Devtools)中的远程更新(Remote Update)功能,这篇文章主要介绍了Spring Boot存在路径遍历漏洞CVE-2021-22118,需要的朋友可以参考下

在这里插入图片描述

0.前言

背景:Spring Boot存在路径遍历漏洞。CVE-2021-22118:

在这里插入图片描述

官方 issue也有对此的记录,感兴趣可以看下

https://github.com/spring-projects/spring-boot/issues/26627

https://github.com/spring-projects/spring-boot/issues/27543

CVE-2021-22118 是一个在 Spring Boot 中发现的漏洞。该漏洞关系到 Spring Boot 的开发者工具(Devtools)中的远程更新(Remote Update)功能。在某些情况下,攻击者可能会利用这个功能进行目录遍历攻击,从而访问到系统中的敏感文件。

需要注意的是,这个漏洞只会影响到使用了 Spring Boot Devtools 的基于文件系统的应用,而且应用还必须满足以下两个条件之一:

  • 远程更新功能被开启(spring.devtools.restart.enabled = true)。
  • 应用使用了默认的 HTTP 更新 URL(spring.devtools.restart.remote-secret)。

如果你的应用满足以上条件,建议尽快进行修复。修复这个漏洞的方法有以下几种:

  • 将 Spring Boot 升级到 2.3.10.RELEASE 或更高版本。
  • 将 Spring Boot 升级到 2.4.5 或更高版本。
  • 将 Spring Boot 升级到 2.5.0 或更高版本。

关于这个漏洞的详细信息,可以参考 Spring 官方的安全通告。
请注意,对于已经在生产环境中运行的应用,修改CORS配置可能会影响到正常的功能。因此,在实施这个修复之前,应该先进行充分的测试。

1.参考文档

CVE 官方网站 https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-22118

2.基础介绍

CVE-2021-22118是在Spring Boot中发现的一个严重的路径遍历漏洞。这个漏洞使攻击者能够以应用程序的身份访问计算机的敏感文件和数据。

1. 影响的版本

这个漏洞影响了Spring Boot 2.3.02.3.72.4.0至`2.4.3以及2.5.0版本。

2. 漏洞利用原理:

漏洞源于Spring Boot在处理用户输入的URL时,未能正确处理“…/”这种可能引起路径遍历的模式。在Spring Boot应用程序配置了Spring MVC并使用了默认的资源处理时,攻击者可以通过精心构造的URL,访问到应用程序类路径上的文件。这就使得攻击者有可能通过这个漏洞访问和下载敏感文件,或者执行非法操作。

官方的修复方式是发布了新的版本,即Spring Boot 2.3.8、2.4.42.5.1。在这些版本中,官方对路径遍历的处理进行了改进。

具体来说,Spring Boot在处理用户请求的URL时,加强了对“…/”这种可能引起路径遍历的模式的处理。当应用程序检测到请求的URL包含这种模式时,会进行更严格的校验,以防止攻击者利用这种模式来访问应用程序类路径之外的文件或目录。

为了修复这个问题,受影响的用户应尽快将其Spring Boot版本升级到官方发布的新版本。实际上,这也是对待任何软件漏洞的通用策略:一旦发现有漏洞存在,就应该尽快升级到最新的、已修复该漏洞的版本。

3.解决方案

3.1. 方案1

Spring在其2.3.82.4.42.5.1版本中修复了这个漏洞。对于受到影响的用户,推荐尽快升级到这些版本。同时,作为临时措施,可以限制用户能访问的URL,或者在服务器端增加对用户提交的URL进行更严格的校验。

3.2. 方案2

临时解决方案
在Nginx中,你可以使用location指令和rewrite指令来拦截和阻止包含"…/"的请求,以下是一个基本的示例配置:

server {
    listen 80;
    server_name your_domain.com;
    location / {
        if ($request_uri ~* "\.\.\/") {
            return 403;
        }
        proxy_pass http://your_upstream;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

这个配置会监听80端口,并将请求代理到http://your_upstream,如果请求的URI中包含"…/“,Nginx会返回403状态码,即"禁止访问”。

这只是防止路径遍历攻击的一种方法,并不能完全保证安全。因此,升级到没有这个漏洞的Spring
Boot版本,仍然是最安全的解决方案。此外,你还应该定期更新Nginx版本,以应用最新的安全修复。

3.3. 方案3

在Spring Boot中你可以通过定制一个拦截器来防止路径遍历攻击。拦截器可以在处理请求前对请求的URL进行检查,如果URL包含非法字符(如"…/“或”./"),则可以拒绝该请求。== 这种可能会误拦截,大家使用的时候注意充分测试和考虑各种渠道==
一个简单示例可供参考

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class PathTraversalInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String uri = request.getRequestURI();
        if (uri.contains("../") || uri.contains("./")) {
            response.sendError(HttpServletResponse.SC_BAD_REQUEST);
            return false;
        }
        return true;
    }
}

需要在一个配置类中将这个拦截器注册到Spring的拦截器链中:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
    private final PathTraversalInterceptor pathTraversalInterceptor;
    public WebConfig(PathTraversalInterceptor pathTraversalInterceptor) {
        this.pathTraversalInterceptor = pathTraversalInterceptor;
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(pathTraversalInterceptor);
    }
}

这样,Spring将会在处理每个请求前,先执行PathTraversalInterceptorpreHandle方法来检查请求的URL。

这种方法 也只能作为临时的解决方案,它不能替代升级SpringBoot到没有该漏洞的版本。因为攻击者可能会使用编码绕过你的检查,而升级Spring Boot可以彻底修复该漏洞。

到此这篇关于Spring Boot存在路径遍历漏洞CVE-2021-22118的文章就介绍到这了,更多相关Spring Boot漏洞内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解springboot整合mongodb

    详解springboot整合mongodb

    本篇文章主要介绍了详解springboot整合mongodb,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • 详解springboot测试类注解

    详解springboot测试类注解

    这篇文章主要介绍了springboot测试类注解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Java 超详细讲解数据结构的应用

    Java 超详细讲解数据结构的应用

    数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合,让我们一起来了解数据结构是如何应用的
    2022-04-04
  • Java面试题冲刺第十九天--数据库(4)

    Java面试题冲刺第十九天--数据库(4)

    这篇文章主要为大家分享了最有价值的三道关于数据库的面试题,涵盖内容全面,包括数据结构和算法相关的题目、经典面试编程题等,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • SSH框架网上商城项目第24战之Struts2中处理多个Model请求的方法

    SSH框架网上商城项目第24战之Struts2中处理多个Model请求的方法

    这篇文章主要为大家详细介绍了SSH框架网上商城项目第24战之Struts2中处理多个Model请求的方法,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • Ribbon负载均衡算法原理与使用介绍

    Ribbon负载均衡算法原理与使用介绍

    在微服务中,对服务进行拆分之后,必然会带来微服务之间的通信需求,而每个微服务为了保证高可用性,又会去部署集群,那么面对一个集群微服务进行通信的时候,如何进行负载均衡也是必然需要考虑的问题
    2022-09-09
  • SpringBoot通过配置Swagger权限解决Swagger未授权访问漏洞问题

    SpringBoot通过配置Swagger权限解决Swagger未授权访问漏洞问题

    这篇文章主要介绍了SpringBoot通过配置Swagger权限解决Swagger未授权访问漏洞问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • java 串口工具jSerialComm示例详解

    java 串口工具jSerialComm示例详解

    这篇文章主要介绍了java 串口工具jSerialComm,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • 分析ZooKeeper分布式锁的实现

    分析ZooKeeper分布式锁的实现

    在分布式的情况下,sychornized 和 Lock 已经不能满足我们的要求了,那么就需要使用第三方的锁了,这里我们就使用 ZooKeeper 来实现一个分布式锁
    2021-06-06
  • SpringBoot集成XXL-JOB实现灵活控制的分片处理方案

    SpringBoot集成XXL-JOB实现灵活控制的分片处理方案

    因为需要并行处理同一张数据表里的数据,所以比较自然地想到了分片查询数据,可以利用对 id 取模的方法进行分片,避免同一条数据被重复处理,所以本文给大家介绍了SpringBoot集成XXL-JOB实现灵活控制的分片处理方案,需要的朋友可以参考下
    2024-09-09

最新评论