百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

尝试将springboot2.7.11升级到3.2.3

nanshan 2024-12-01 01:32 7 浏览 0 评论

一、背景

spring boot 修复 Spring Framework URL解析不当漏洞(CVE-2024-22243)

1、漏洞描述

当应用程序使用UriComponentsBuilder来解析外部提供的URL(如通过查询参数)并对解析的URL的主机执行验证检查时可能容易受到Open重定向攻击和SSRF攻击,导致网络钓鱼和内部网络探测等。

2、受影响产品或系统

6.1.0 <= Spring Framework <= 6.1.3
6.0.0 <= Spring Framework <= 6.0.16
5.3.0 <= Spring Framework <= 5.3.31

3、官方建议修复方案

Spring Framework 版本6.1.x 用户:升级到 6.1.4
Spring Framework 版本6.0.x 用户:升级到 6.0.17
Spring Framework 版本5.3.x 用户:升级到 5.3.32
springboot升级到3.1.9或者3.2.3
其它已经不受官方支持的版本(5.1.x,5.2.x)同样受到影响,更新到受官方支持的安全版本。

因为我们的系统是2.7.11,所以尝试升级到最新的版本3.2.3。

一、升级过程

1、复制项目

由于2到3改动太大,升级不一定成功,所以这里复制一份项目,复制完后记得修改下pom.xml的项目名称
2、修改springboot的版本依赖
这里将2.7.11改到3.2.3

<parent> 
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
  <!--  <version>2.7.11</version>  -->
       <version>3.2.3</version>
  </parent>

重新编译

3、启动测试

不要管报错,直接启动测试,发现jdk版本不对

Exception in thread "main" java.lang.UnsupportedClassVersionError: org/springframework/boot/SpringApplication has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 52.0
    at java.lang.ClassLoader.defineClass1(Native Method)

1、2019年1月15日发布的Oracle JDK 8u201和8u202是最后一个免费版本,后续的都是收费的
2、springboot3.x后最少都要jdk17,所以这里只能用开源的openjdk17或者RedHatOpenJDK17

4、替换servlet的相关import

springboot3.x后用的是jakarta,所以也没上所有涉及这些引入的地方全部都要改动

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

改为

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

包括但不限于上面三个,这边几乎在所有Controller和service的页面都有修改,所以就没个页面都打开替换了一下,最后再看,但是一开始会发现没有这些依赖,这里需要再pom.xml引入

        <dependency>
            <groupId>jakarta.persistence</groupId>
            <artifactId>jakarta.persistence-api</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>jakarta.servlet</groupId>
            <artifactId>jakarta.servlet-api</artifactId>
            <version>6.0.0</version>
        </dependency>

eclipse并不会立即提示那些类没有引入,可能是我eclipse版本的原因,只能一个个改,有时候还会没有任何反应,启动也启动不了,这时只能重启

5、org/yaml/snakeyaml/inspector/TagInspector的错误

这里上面一步骤后还会有写类报错,这里暂时不处理先,直接先启动发现

17:15:09.565 [restartedMain] ERROR org.springframework.boot.SpringApplication - Application run failed
java.lang.NoClassDefFoundError: org/yaml/snakeyaml/inspector/TagInspector
Caused by: java.lang.IllegalStateException: java.lang.NoClassDefFoundError: org/yaml/snakeyaml/inspector/TagInspector
    at org.springframework.boot.SpringApplication.handleRunFailure(SpringApplication.java:825)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:344)
    at com.gdpost.activity.mgr.AppActivityMGR.main(AppActivityMGR.java:23)
    ... 5 more

这个需要再pom.xml引入

<dependency>
            <groupId>org.yaml</groupId>
            <artifactId>snakeyaml</artifactId>
            <version>2.2</version>
        </dependency>

6、日志冲突

启动后会报一连串日志冲突错误

The following method did not exist:

    'void org.apache.logging.log4j.util.PropertiesUtil.addPropertySource(org.apache.logging.log4j.util.PropertySource)'

The calling method's class, org.springframework.boot.logging.log4j2.Log4J2LoggingSystem, was loaded from the following location:

    jar:file:/D:/Software/repository/org/springframework/boot/spring-boot/3.2.3/spring-boot-3.2.3.jar!/org/springframework/boot/logging/log4j2/Log4J2LoggingSystem.class

The called method's class, org.apache.logging.log4j.util.PropertiesUtil, is available from the following locations:

我这里是把相关引入的日志注释

   <!--  <dependency>
      <groupId>org.apache.logging.log4j</groupId>
       <artifactId>log4j-api</artifactId>
       <version>2.17.2</version>
</dependency> -->

具体每个系统具体分析,这里还把其它应用日志的版本也去掉才行,不然好像还报如下错误

ERROR StatusLogger Unable to create Lookup for ctx
 java.lang.NoSuchMethodError: 'java.lang.ClassLoader[] org.apache.logging.log4j.util.LoaderUtil.getClassLoaders()'

7、 Invalid value type for attribute ‘factoryBeanObjectType’:

TRACE StatusConsoleListener AsyncLoggerConfig[org.springframework.context.annotation.ConfigurationClassPostProcessor] stopping...
[2024-03-07 17:22:13,114]-[ERROR]-[restartedMain]-[org.springframework.boot.SpringApplication]-[]-Application run failed
java.lang.IllegalArgumentException: Invalid value type for attribute 'factoryBeanObjectType': java.lang.String’

这个错误需要将mybatis的版本修改

<!-- mybatis依赖 -->
      <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <!-- <version>2.2.2</version> -->
        <version>3.0.3</version> 
    </dependency>

8、tomcat版本错误

    'void org.apache.catalina.Context.addServletContainerInitializer(jakarta.servlet.ServletContainerInitializer, java.util.Set)'

The calling method's class, org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory, was loaded from the following location:

    jar:file:/D:/Software/repository/org/springframework/boot/spring-boot/3.2.3/spring-boot-3.2.3.jar!/org/springframework/boot/web/embedded/tomcat/TomcatServletWebServerFactory.class

The called method's class, org.apache.catalina.Context, is available from the following locations:

jar:file:/D:/Software/repository/org/apache/tomcat/embed/tomcat-embed-core/9.0.73/tomcat-embed-core-9.0.73.jar!/org/apache/catalina/Context.class

springboot3.x后。tomcat版本也要对应修改,我这边是因为制定了版本,去掉指定即可

<properties> 
        <!--<tomcat.version>8.5.77</tomcat.version>-->
        <!-- <tomcat.version>9.0.65</tomcat.version> -->
        <!-- <tomcat.version>9.0.73</tomcat.version> -->
  </properties>

9、redis链接错误

严重: Servlet.service() for servlet [dispatcherServlet] in context with path [/activitymgr] threw exception
org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis
    at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$ExceptionTranslatingConnectionProvider.translateException(LettuceConnectionFactory.java:1795)
    at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$ExceptionTranslatingConnectionProvider.getConnection(LettuceConnectionFactory.java:1726)
    at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceConnectionFactory.java:1528)
    at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.lambda$getConnection$0(LettuceConnectionFactory.java:1508)
    at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.doInLock(LettuceConnectionFactory.java:1469)

这个是因为springboot3以后的版本redis配置变了
sring.redis变为spring.data.redis

10、 javax.xml.bind.DatatypeConverter找不到

Caused by: java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter
    ... 94 more
jakarta.servlet.ServletException: Handler dispatch failed: java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter

pm.xml加上

        <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-core</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>activation</artifactId>
        <version>1.1.1</version>
</dependency>

11、freemarker页面取session的值的问题

发现freemarker直接取session取不了了,要从session中取出来然后设置到request中

12、sun.misc.BASE64Encoder和sun.misc.BASE64Decoder的替代

这两个类是sun公司的内部方法,并没有在java api中公开过,不属于JDK标准库范围,java8后已经弃用了,这里可以用java.util。Base64来替代

Base64.Encoder base64Encoder = Base64.getEncoder();
Base64.Decoder base64Decoder = Base64.getDecoder();

12、GLIBC版本问题

Error: dl failure on line 542
Error: failed /home/ssmuser/activity_mgr_new/jdk-17.0.2/lib/server/libjvm.so, because /lib64/libc.so.6: version `GLIBC_2.6' not found (required by /home/ssmuser/activity_mgr_new/jdk-17.0.2/lib/server/libjvm.so)

jdk17需要2.6的版本,但是目前系统的版本是2.5.

查看目前系统的版本

ldd --version
ldd (GNU libc) 2.5
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.

尝试备份服务器升级到2.6

tar -zxvf glibc-2.6.tar.gz

mkdir build
cd build
../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin
make && make install

继续启动程序然后报缺失2.7,继续尝试升级,然后执行jps等java命令直接报段错误,尝试重启虚拟机,也不行

13、生成环境glibc版本

发现生产环境glibc版本为2.12,更加低,几乎没有机会升级到2.7,因此该升级方案失败。

二、直接升级结果失败

代码升级成功,本地启动测试成功,开发环境启动jdk17发现GLIBC需要2.7,开发环境为2.5升级到2.7后相关java启动命令报段错误,暂时没有解决,生成环境GLIBC为2.12,估计更加难升级2.7. 因此除非服务器环境支持,否则难以升级到springboot3.2.3的版本。

三、替换相关jar包升级

         <!-- spring-web 相关 begin -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.3.32</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.32</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.3.32</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.3.32</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.32</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>5.3.32</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.3.32</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>5.3.32</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jcl</artifactId>
            <version>5.3.32</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.32</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-oxm</artifactId>
            <version>5.3.32</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.3.32</version>
        </dependency>
        <!-- spring-web相关 end -->

该方案可行。

四、结论

如果你的服务器GLIBC能升级到2.7可以尝试直接升级版本,如果不行可能就得升级相关jar包。当然升级相关jar包的后果就是你的springboot以后也很难从2.x到3.x了。

相关推荐

今晚拿下PHP反序列化的一系列操作

引言在CTF中反序列化类型的题目还是比较常见的,之前有学习过简单的反序列化,以及简单pop链的构造。这次学习内容为php内置的原生类的反序列化以及一点进阶知识。在题目给的的代码中找不到可利用的类时,这...

Win10安装Apache和PHP(apache安装php模块)

说明:虽然PHPStudy之类的软件给我们提供了方便的集成环境,但是其使用的是非线程安全的PHP版本(NotThreadSafe,NTS),某些功能不可以使用。所以,我们还需要自己再安装一个Apa...

腾讯云云函数部署laravel项目(腾讯云函数 selenium)

1、购买函数套餐包在Serverless控制台,选择函数套餐包进行购买2、新建函数服务2.1、模板创建选择函数URL:新建函数URL,启用公网访问:2.1.1、postman访问首页2.1.2、pos...

站长教你搭建属于自己的网站(站长教你搭建属于自己的网站是什么)

每个人都希望可以有自己的网站,因为那样高端大气上档次,低调奢华有内涵,尤其是公司用户,一般会有自己的网站。而个人呢,也可以搭建自己的网站博客,论坛等,但是一般个人都是搭建博客的。好了,那么下面站长教你...

微信公众号开发出现 cURL error 60: SSL certificate problem ssl证书

在phpstudy的环境下如果出现这样的报错cURLerror60:SSLcertificateproblem:unabletogetlocalissuercertificat...

【网络安全】关于PHP Study nginx解析高危漏洞的预警通报

网络安全近日,山石网科安全研究院监测发现PHPStudyWindows最新版本存在nginx解析漏洞,可以造成任意代码执行。一、漏洞情况phpStudy是一个PHP调试环境的程序集成包,该程序包集成...

PHP 环境 搭建教程(php环境搭建教程linux)

PHP是一种编程语言,很多网站都用PHP语言编写,我们有时候需要测试一个网站,就需要PHP环境才能运行,又要安装Apache、又要安装MySQL……真的非常麻烦。其实我们可以使用PHP集成...

黑客搭建钓鱼平台,手把手教你如何钓鱼?

跨站脚本攻击XSS:通过HTML注入篡改了网页,插入了恶意的脚本,从而用户浏览网页时,控制用户浏览器的一种攻击那么,我们搭建一个XSS钓鱼平台吧,注意:这个平台仅用于学习和测试,小伙伴们不要动有坏心思...

php源码网站搭建方法和过程(php网站源码完整)

web网站是我们上网的窗口,而网站是如何搭建的呢?今天我们来做一个介绍,以php代码为例来进行介绍(后续会介绍一下java代码搭建,如果想要我这里涉及的工具或源码请私信我)。1、首先你需要去网上下载你...

使用VS Code调试PhpStudy环境里的代码

最近几个月把所有项目都迁过来VSCode了(除了因为Unity调试问题反而用回了VisualStudio),PHP也就抛弃了最强的PhpStorm。这段时间抽空在帮朋友处理PHP项目,然...

phpstudy搭建PHP+Mysql服务(用phpstudy搭建服务器)

PHP是一种创建动态交互性站点的强有力的服务器端脚本语言。PHP是免费的,并且使用非常广泛。同时,对于像微软ASP这样的竞争者来说,PHP无疑是另一种高效率的选项。(1)PHP环境搭建使用V...

Windows安装phpstudy(Windows安装mysql)

说明:phpstudy是一个PHP+MySQL+Apache的集成环境,可以减少单独部署各个所需软件的麻烦,以及更加方便地切换版本。phpenv、wamp等软件的作用一样。由于环境的不同,安装过程中可...

phpstudy安装及简单使用教程(phpstudy安装教程详解)

phpstudy前不久爆出有后门,我的看法是,去看下是哪个版本有后门,为啥会有后门,怎么解决掉这个后门,而不是听到后门就弃用了。毕竟phpstudy绿色安装,配置简单,多版本融合,真香。前言:关于开发...

如何对dedeCMS的开源程序进行二次开发

二次开发,简单的说就是在现有的软件上进行定制修改,功能的扩展,然后达到自己想要的功能和效果,一般来说都不会改变原有系统的内核。为了让更多人了解二次开发,并更方便的了解DedeCMS的二次开发,下面将会...

mysql基础问题三问(底层逻辑;正在执行;日志观察)

背景:经常面试会遇到且实际工作中也会应用到的三个场景:目录:一.mysql查询时的底层原理是什么?二.如何查看正在执行的mysql语句?三.如何观察mysql运行过程中的日志信息?-----...

取消回复欢迎 发表评论: