Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
spring4shell-local-verification-lab — Spring Framework CVE-2022-22965 本地影响条件验证、版本升级修复与复测项目 | Kitploit
工具/GitHubGitHub/meng-security/spring4shell-local-verification-lab
漏洞分析代码分析漏洞利用Web安全学习与教育实验室与实践
GitHubmeng-security/spring4shell-local-verification-lab

spring4shell-local-verification-lab

Spring Framework CVE-2022-22965 本地影响条件验证、版本升级修复与复测项目

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
查看仓库
11个月前尚未审核
分享

Spring4Shell 本地影响条件验证、修复与复测项目

项目简介

本项目用于学习和验证 Spring Framework CVE-2022-22965,也就是 Spring4Shell 漏洞的影响条件、风险表现、修复方法和修复后复测流程。

项目在个人搭建的本地授权环境中完成。项目重点不是对真实目标进行攻击,而是通过搭建修复前和修复后的 Spring MVC 测试环境,逐项确认漏洞相关影响条件,并使用安全、可控的只读方式观察 Spring 数据绑定内部属性路径在版本升级前后的差异。

本项目完成了以下流程:

  • JDK、Maven 和 Apache Tomcat 环境准备
  • Spring MVC WAR 项目搭建
  • 正常功能基线验证
  • 漏洞影响条件确认
  • 内部属性路径只读诊断
  • 漏洞成因分析
  • Spring Framework 版本升级
  • 修复后安全复测
  • 修复后正常功能复测
  • 测试报告和截图证据整理

安全声明

本项目仅用于个人本地自建环境或明确授权的安全测试环境。

项目不针对任何公网网站、服务器或第三方业务系统进行扫描、探测和漏洞利用,不包含真实用户数据和真实业务数据。

测试过程中未执行以下操作:

  • 未写入 WebShell
  • 未执行系统命令
  • 未修改 Tomcat 配置
  • 未建立反弹 Shell
  • 未进行持久化控制
  • 未对任何外部系统产生影响

禁止将本项目中的测试方法用于任何未授权目标。

漏洞背景

CVE-2022-22965 通常被称为 Spring4Shell,是 Spring Framework 中与请求参数数据绑定机制有关的远程代码执行漏洞。

Spring MVC 支持将 HTTP 请求参数自动绑定到 Java 对象属性中。例如,本项目通过以下方式接收姓名和邮箱参数:

@ModelAttribute("profile") UserProfile profile

正常情况下,请求参数 name 和 email 会根据属性名称绑定到 UserProfile 对象中。

在受影响版本中,对部分内部属性路径的访问限制不够严格。在使用 JDK 9 或更高版本,并满足特定 Servlet 容器、部署方式和数据绑定条件时,外部请求参数可能沿着普通业务对象继续访问 Java Class、模块、类加载器或容器相关的内部对象。

在特定可利用环境中,攻击者可能进一步修改服务器配置或写入服务器文件,从而形成远程代码执行风险。

本项目不执行完整远程代码利用,而是使用以下属性路径进行安全、只读的差异诊断:

class.module.name

项目目标

  1. 理解 Spring MVC 请求参数数据绑定的基本过程。
  2. 搭建本地 Spring MVC WAR 测试项目。
  3. 完成正常业务功能基线验证。
  4. 确认 Spring Framework、JDK、Tomcat、WAR 部署和数据绑定入口等影响条件。
  5. 使用只读方式观察内部属性路径的访问表现。
  6. 分析漏洞产生的主要原因。
  7. 将 Spring Framework 升级至修复版本。
  8. 使用相同方法完成修复后复测。
  9. 确认版本升级未影响正常业务功能。
  10. 整理项目源码、测试报告和截图证据。

实验环境

本项目在个人本地 VMware 隔离实验环境中完成。

  • 宿主机: Windows 11
  • 靶机: Windows 10 虚拟机
  • 虚拟化软件: VMware Workstation
  • Java 环境: Eclipse Temurin JDK 11.0.31
  • 项目构建工具: Apache Maven 3.9.16
  • Servlet 容器: Apache Tomcat 9.0.60
  • 修复前 Spring Framework 版本: 5.3.17
  • 修复后 Spring Framework 版本: 5.3.18
  • Web 框架: Spring MVC
  • 项目部署方式: 传统 WAR 包部署
  • 测试地址: 127.0.0.1

正常功能测试数据:

  • 姓名:Alice
  • 邮箱:[email protected]

安全诊断属性路径:

class.module.name

项目结构

spring4shell-local-verification-lab/

  • README.md:项目介绍、测试思路、验证结果和修复说明
  • docs/:Spring4Shell 本地影响条件验证、修复与复测报告
  • images/:项目环境、测试过程和复测截图
  • vulnerable-demo/:使用 Spring Framework 5.3.17 的修复前项目
  • fixed-demo/:使用 Spring Framework 5.3.18 的修复后项目
  • notes/:学习笔记和过程记录

主要源码结构:

  • config/:Spring MVC 配置类和应用初始化类
  • controller/:表单处理和属性路径诊断控制器
  • model/:用于接收姓名和邮箱参数的 UserProfile 类
  • WEB-INF/views/:首页、提交结果和诊断结果 JSP 页面

测试项目说明

本项目分别建立了修复前和修复后两个 Spring MVC 应用。

修复前项目

项目目录:

vulnerable-demo

使用版本:

Spring Framework 5.3.17

生成的 WAR 文件:

spring4shell-vulnerable-demo.war

访问地址:

http://127.0.0.1:8080/spring4shell-vulnerable-demo/

诊断页面:

http://127.0.0.1:8080/spring4shell-vulnerable-demo/binding-probe

修复后项目

项目目录:

fixed-demo

使用版本:

Spring Framework 5.3.18

生成的 WAR 文件:

spring4shell-fixed-demo.war

访问地址:

http://127.0.0.1:8080/spring4shell-fixed-demo/

诊断页面:

http://127.0.0.1:8080/spring4shell-fixed-demo/binding-probe

正常功能说明

测试项目提供一个简单的用户资料表单,包含:

  • 姓名输入框
  • 邮箱输入框
  • 提交资料按钮

控制器通过以下方式接收请求参数:

@ModelAttribute("profile") UserProfile profile

当用户提交姓名和邮箱后,Spring MVC 会将 name 和 email 参数自动绑定至 UserProfile 对象。

结果页面会读取绑定后的对象,并显示用户提交的姓名和邮箱。

该功能用于确认项目能够正常运行,同时证明应用中存在有效的 Spring MVC 请求参数数据绑定入口。

测试思路

本项目按照“先确认正常功能,再确认影响条件,之后进行只读风险诊断,最后修复并复测”的思路进行。

  1. 安装并配置 JDK 11、Maven 和 Apache Tomcat。
  2. 使用 Spring Framework 5.3.17 搭建 Spring MVC 项目。
  3. 创建姓名和邮箱表单。
  4. 使用 @ModelAttribute 将请求参数绑定至 UserProfile 对象。
  5. 使用 Maven 将项目打包为 WAR 文件。
  6. 将 WAR 文件部署至独立运行的 Apache Tomcat。
  7. 提交本地模拟用户资料,完成正常功能基线验证。
  8. 检查实际运行的 JDK、Tomcat、Spring Framework 和部署方式。
  9. 使用 Spring BeanWrapper 对 class.module.name 进行只读诊断。
  10. 记录 Spring Framework 5.3.17 环境中的属性路径访问结果。
  11. 将 Spring Framework 升级至 5.3.18。
  12. 重新构建并部署修复后的项目。
  13. 使用相同属性路径进行修复后复测。
  14. 再次提交姓名和邮箱,确认正常功能未受到影响。

影响条件确认

本项目对以下影响条件进行了逐项确认:

  • 使用 JDK 11.0.31,满足 JDK 9 或更高版本条件
  • 使用 Spring Framework 5.3.17
  • 项目包含 spring-webmvc 组件
  • 使用 Apache Tomcat 9.0.60
  • 项目以传统 WAR 包形式部署
  • 项目由独立运行的 Tomcat 加载
  • 控制器存在基于 @ModelAttribute 的数据绑定入口

修复前项目实际部署的 Spring 依赖包括:

  • spring-beans-5.3.17.jar
  • spring-core-5.3.17.jar
  • spring-web-5.3.17.jar
  • spring-webmvc-5.3.17.jar

本项目不会仅根据 Spring Framework 版本直接判断漏洞是否成立,而是结合 JDK、Spring MVC、Tomcat、WAR 部署和数据绑定入口进行综合分析。

风险诊断方式

为了避免执行具有破坏性的漏洞利用,本项目使用 Spring Framework 提供的 BeanWrapper 对以下属性路径进行只读检查:

class.module.name

该路径表示:

  • class:访问当前业务对象对应的 Java Class 对象
  • module:访问该类所属的 Java 模块
  • name:读取模块名称

诊断过程只调用属性可读性检查和属性值读取方法:

  • 不设置对象属性
  • 不修改服务器配置
  • 不写入服务器文件
  • 不执行操作系统命令

因此,该诊断只能用于观察内部属性路径在修复前后的访问差异,不能单独证明已经实现远程代码执行。

验证结果

修复前结果

修复前环境使用:

Spring Framework 5.3.17

检查属性路径:

class.module.name

诊断结果:

  • 是否可以读取:true
  • 读取结果:null

true 表示当前环境可以沿着普通业务对象的 class 属性继续解析 module.name。

读取结果为 null,是因为当前 WAR 应用运行在 Java 未命名模块中,模块名称为空,不代表属性路径读取失败。

修复后结果

修复后环境使用:

Spring Framework 5.3.18

使用相同属性路径重新诊断:

class.module.name

诊断结果:

  • 是否可以读取:false
  • 读取结果:Not readable

修复前后的结果形成明确对比:

  • Spring Framework 5.3.17:属性路径可以读取
  • Spring Framework 5.3.18:属性路径不可读取

该结果说明版本升级后,原诊断属性路径的访问已经受到限制,修复前观察到的风险表现不再出现。

修复措施

本项目采用升级 Spring Framework 版本的方式进行修复。

修复前配置:

<spring.version>5.3.17</spring.version>

修复后配置:

<spring.version>5.3.18</spring.version>

修复过程中完成了以下操作:

  1. 将修复前项目复制到 fixed-demo。
  2. 保持 Controller、数据模型和 JSP 页面业务逻辑不变。
  3. 将 Spring Framework 从 5.3.17 升级至 5.3.18。
  4. 使用 Maven 重新下载修复版本依赖。
  5. 重新编译并生成修复版 WAR 文件。
  6. 将修复版 WAR 部署至 Apache Tomcat。
  7. 检查修复项目实际部署的 Spring JAR 版本。
  8. 使用原属性路径完成安全复测。
  9. 重新测试姓名和邮箱提交功能。

修复后项目实际部署的 Spring 依赖包括:

  • spring-beans-5.3.18.jar
  • spring-core-5.3.18.jar
  • spring-web-5.3.18.jar
  • spring-webmvc-5.3.18.jar

该结果证明修复版本已经被重新构建并实际部署,不是只修改了 pom.xml 中的版本号。

修复后正常功能复测

升级至 Spring Framework 5.3.18 后,重新访问修复项目首页并提交以下测试数据:

  • 姓名:Alice
  • 邮箱:[email protected]

提交后,页面仍然正常显示:

  • 用户资料提交成功
  • 姓名为 Alice
  • 邮箱为 [email protected]

该结果说明版本升级没有影响项目原有的正常请求参数绑定和页面显示功能。

漏洞成因

Spring MVC 的自动数据绑定机制可以根据 HTTP 请求参数名称访问 Java 对象属性。

正常业务参数 name 和 email 只需要访问 UserProfile 中对应的普通属性。

但是,Spring 的属性访问机制还支持带点号的嵌套属性路径。在受影响版本中,对部分内部属性路径的限制不够严格,使外部参数在特定环境中可能从普通业务对象继续进入 Java Class、模块、类加载器或 Servlet 容器相关对象。

当内部对象存在能够影响服务器配置或文件系统的可写属性,并且应用同时满足 JDK、Tomcat、WAR 部署和数据绑定等条件时,可能进一步形成远程代码执行风险。

该漏洞不是因为 name 或 email 属性本身存在问题,也不是所有使用 Spring MVC 的项目都一定可以被利用。漏洞成立通常需要多个条件共同存在。

修复建议

真实业务系统中建议采取以下措施:

  • 排查实际运行的 Spring Framework 和 Spring Boot 版本
  • 优先升级至仍受官方支持的安全版本
  • 升级后重新构建和部署应用
  • 检查最终部署包中的实际 Spring JAR 版本
  • 对 Controller 的数据绑定范围进行限制
  • 只允许绑定正常业务需要的字段
  • 使用专门的请求数据对象接收外部参数
  • 避免将数据库实体或内部复杂对象直接暴露给外部参数
  • 不依赖前端校验完成安全限制
  • 对无法立即升级的系统采取临时缓解措施
  • 临时缓解措施不能替代正式版本升级
  • 使用低权限账户运行 Tomcat 和 Java 服务
  • 对应用目录和配置目录设置最小必要权限
  • 监控异常请求参数和服务器文件变化
  • 修复后同时进行安全复测和正常业务功能复测

关键截图证据

环境与部署

JDK 11 版本确认

Maven 版本确认

Apache Tomcat 9.0.60 启动成功

Maven 打包成功

WAR 项目部署成功

正常功能基线

测试项目首页正常访问

正常功能基线验证成功

修复前验证

Spring Framework 5.3.17 依赖确认

修复前内部属性路径可读

修复与复测

修复版本打包成功

修复后内部属性路径不可读

修复后正常功能复测成功

修复后 Spring Framework 5.3.18 依赖确认

当前进度

  • 创建项目目录
  • 编写 README
  • 创建测试报告
  • 准备 JDK、Maven 和 Tomcat 环境
  • 搭建 Spring MVC 测试项目
  • 完成 WAR 项目打包与部署
  • 完成正常功能基线验证
  • 完成漏洞影响条件确认
  • 完成本地只读风险诊断
  • 完成漏洞成因分析
  • 完成 Spring Framework 版本升级
  • 完成修复后安全复测
  • 完成修复后正常功能复测
  • 确认修复后实际依赖版本
  • 整理测试报告和截图证据

项目总结

本项目在本地隔离环境中完成了 Spring Framework CVE-2022-22965 的影响条件确认、风险表现诊断、版本升级修复和修复后复测。

修复前项目使用 Spring Framework 5.3.17。在 JDK 11、Spring MVC、Apache Tomcat 9.0.60 和传统 WAR 部署环境中,class.module.name 属性路径被判断为可以读取。

修复后项目将 Spring Framework 升级至 5.3.18。相同属性路径变为不可读取,同时姓名和邮箱的正常数据绑定功能仍然可以使用。

本项目没有执行完整远程代码利用,而是通过安全、可控的只读方法完成修复前后差异验证。

项目重点体现了以下能力:

  • Java 和 Spring MVC 基础环境搭建
  • Maven 项目构建
  • Tomcat WAR 应用部署
  • Spring 数据绑定机制理解
  • 漏洞影响条件分析
  • 安全测试过程设计
  • 组件版本升级
  • 修复后复测
  • 正常功能回归测试
  • 安全测试报告编写
  • 截图证据和 GitHub 项目整理
下载工具