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项目中的favicon.ico图标无法显示问题及解决

    SpringBoot项目中的favicon.ico图标无法显示问题及解决

    这篇文章主要介绍了SpringBoot项目中的favicon.ico图标无法显示问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • SpringBoot 集成 MyBatis/MyBatis-Plus 超详细教程

    SpringBoot 集成 MyBatis/MyBatis-Plus 超详细教程

    本文详细介绍了SpringBoot集成MyBatis和MyBatis-Plus的完整流程,包括数据源配置、Mapper扫描、XML映射等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-06-06
  • SpringBoot开启虚拟线程的实现流程

    SpringBoot开启虚拟线程的实现流程

    虚拟线程(Virtual Thread)也称协程或纤程,是一种轻量级的线程实现,与传统的线程以及操作系统级别的线程(也称为平台线程)相比,它的创建开销更小、资源利用率更高,本文给大家介绍了SpringBoot如何开启虚拟线程,需要的朋友可以参考下
    2024-06-06
  • Java使用SFTP上传文件到服务器的简单使用

    Java使用SFTP上传文件到服务器的简单使用

    这篇文章主要介绍了Java使用SFTP上传文件到服务器的简单使用,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-02-02
  • Java Arrays工具类用法详解

    Java Arrays工具类用法详解

    这篇文章主要介绍了Java Arrays工具类用法,结合实例形式分析了java Arrays工具类针对数组元素修改、复制、排序等操作使用技巧与相关注意事项,需要的朋友可以参考下
    2019-05-05
  • Java增加自定义注解进行校验入参详解

    Java增加自定义注解进行校验入参详解

    这篇文章主要为大家详细介绍了Java如何通过增加自定义注解实现校验入参功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-04-04
  • Java 回调机制(CallBack) 详解及实例代码

    Java 回调机制(CallBack) 详解及实例代码

    这篇文章主要介绍了 Java 回调机制(CallBack) 详解及实例代码的相关资料,需要的朋友可以参考下
    2017-02-02
  • idea创建SpringBoot自动创建Lombok无效果的问题解决方案

    idea创建SpringBoot自动创建Lombok无效果的问题解决方案

    这篇文章主要介绍了idea创建SpringBoot自动创建Lombok无效果的问题解决方案,感兴趣的朋友跟随小编一起看看吧
    2024-12-12
  • 利用JDBC的PrepareStatement打印真实SQL的方法详解

    利用JDBC的PrepareStatement打印真实SQL的方法详解

    PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程,下面这篇文章主要给大家介绍了关于利用JDBC的PrepareStatement打印真实SQL的方法,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-07-07
  • Java中防止数据重复提交超简单的6种方法

    Java中防止数据重复提交超简单的6种方法

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,这篇文章主要给大家介绍了关于Java中防止数据重复提交超简单的6种方法,需要的朋友可以参考下
    2021-11-11

最新评论