CVE-2025-24813 Tomcat反序列化漏洞深度解析与教学文档
漏洞概述
漏洞编号: CVE-2025-24813
影响版本:
- Apache Tomcat 11.0.0-M1 至 11.0.2
- Apache Tomcat 10.1.0-M1 至 10.1.34
- Apache Tomcat 9.0.0-M1 至 9.0.98
漏洞类型: 反序列化漏洞
危害等级: 高危(可导致远程代码执行)
漏洞原理
该漏洞的核心在于Tomcat在处理不完整PUT请求上传时,会使用基于用户提供的文件名和路径生成的临时文件。当满足特定条件时,攻击者可以利用此机制上传恶意序列化对象,随后通过Tomcat的会话持久化机制触发反序列化,最终执行任意代码。
漏洞触发条件
- 默认Servlet启用了写权限(默认禁用)
- 启用了部分PUT请求支持(默认启用)
- 应用程序使用Tomcat的基于文件的会话持久化(默认存储位置)
- 应用程序包含可被利用于反序列化攻击的库
漏洞详细分析
第一部分:恶意文件上传
-
入口点:
org.apache.catalina.servlets.DefaultServlet#doPut -
关键方法:
parseContentRange- 仅支持
bytes类型的Content-Range - 其他类型不支持
- 仅支持
-
核心方法:
executePartialPut- 根据请求头
Content-Range: bytes 0-1000/1200设置写入位置和字节总量 - 关键点:设置的值必须比请求体中实际恶意代码的byte大,否则会造成恶意代码保存不完整
- 执行完成后,恶意文件已成功写入磁盘
- 根据请求头
第二部分:反序列化触发
-
入口点:
org.apache.catalina.connector.Request#getSessionInternal(boolean)- 当请求头中包含
Cookie: JSESSIONID=.poc时触发 - 不会创建新session,而是寻找已有session
- 当请求头中包含
-
调用链:
PersistentManager: Tomcat用于持久化session(跨重启)的Manager实现findSession: session为null时继续流程swapInloadSessionFromStore- 最终触发反序列化
-
反序列化点:
org.apache.catalina.session.FileStore#load- 从文件中读取并反序列化session对象
- 触发恶意代码执行
-
底层实现:
StandardSession.readObjectData- 与普通
readObject的区别需要进一步分析
- 与普通
漏洞利用步骤
-
生成恶意序列化对象
- 参考上篇文章中的POC生成方法
- 确保包含可利用的反序列化gadget链
-
构造PUT请求
- 设置
Content-Range头,确保覆盖完整的恶意代码 - 示例:
Content-Range: bytes 0-1000/1200 - 实际恶意代码应小于1000字节
- 设置
-
触发反序列化
- 发送带有特定JSESSIONID的请求
- 示例:
Cookie: JSESSIONID=.poc
防御措施
-
禁用默认Servlet的写权限
- 修改conf/web.xml中的DefaultServlet配置
- 设置
readonly为true
-
禁用部分PUT请求支持
- 修改conf/web.xml中的DefaultServlet配置
- 设置
allowPartialPut为false
-
避免使用文件会话持久化
- 考虑使用其他会话持久化机制
- 或确保会话存储目录不可被外部访问
-
移除危险的反序列化库
- 审查应用程序依赖
- 移除或升级包含已知反序列化漏洞的库
-
更新Tomcat版本
- 升级到不受影响的版本
技术深度解析
文件上传机制
Tomcat处理部分PUT请求时,会将上传的文件片段存储在临时目录中。攻击者可以精心构造文件名和路径,使文件被存储在会话持久化目录中。
会话持久化流程
- 启动时加载: Tomcat启动时会从持久化存储中加载session
- 请求时加载: 当请求中带有现有session ID时,会尝试从存储中加载
- 反序列化过程: 使用Java原生反序列化机制读取session文件
反序列化差异
StandardSession.readObjectData与普通readObject的主要区别在于:
- 包含Tomcat特定的session属性处理
- 有额外的验证逻辑
- 但仍然使用Java原生反序列化机制,因此无法防御恶意gadget链
研究价值
- 多阶段漏洞利用: 结合文件上传和反序列化两个阶段
- 默认配置问题: 虽然部分配置默认安全,但常见组合仍可导致漏洞
- 持久化机制滥用: 展示了持久化机制如何被攻击者利用
总结
CVE-2025-24813是一个典型的链式漏洞,结合了文件上传和反序列化两个安全问题。理解该漏洞需要掌握Tomcat的文件处理机制、会话管理架构以及Java反序列化原理。防御此类漏洞需要从配置管理和代码安全两方面入手,同时保持对依赖库的安全更新。