还原漏洞调用链:CVE-2025-24813 Tomcat 反序列化漏洞源码深度解析(下篇)
字数 2121 2025-08-30 06:50:27

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的会话持久化机制触发反序列化,最终执行任意代码。

漏洞触发条件

  1. 默认Servlet启用了写权限(默认禁用)
  2. 启用了部分PUT请求支持(默认启用)
  3. 应用程序使用Tomcat的基于文件的会话持久化(默认存储位置)
  4. 应用程序包含可被利用于反序列化攻击的库

漏洞详细分析

第一部分:恶意文件上传

  1. 入口点: org.apache.catalina.servlets.DefaultServlet#doPut

  2. 关键方法: parseContentRange

    • 仅支持bytes类型的Content-Range
    • 其他类型不支持
  3. 核心方法: executePartialPut

    • 根据请求头Content-Range: bytes 0-1000/1200设置写入位置和字节总量
    • 关键点:设置的值必须比请求体中实际恶意代码的byte大,否则会造成恶意代码保存不完整
    • 执行完成后,恶意文件已成功写入磁盘

第二部分:反序列化触发

  1. 入口点: org.apache.catalina.connector.Request#getSessionInternal(boolean)

    • 当请求头中包含Cookie: JSESSIONID=.poc时触发
    • 不会创建新session,而是寻找已有session
  2. 调用链:

    • PersistentManager: Tomcat用于持久化session(跨重启)的Manager实现
    • findSession: session为null时继续流程
    • swapIn
    • loadSessionFromStore
    • 最终触发反序列化
  3. 反序列化点: org.apache.catalina.session.FileStore#load

    • 从文件中读取并反序列化session对象
    • 触发恶意代码执行
  4. 底层实现: StandardSession.readObjectData

    • 与普通readObject的区别需要进一步分析

漏洞利用步骤

  1. 生成恶意序列化对象

    • 参考上篇文章中的POC生成方法
    • 确保包含可利用的反序列化gadget链
  2. 构造PUT请求

    • 设置Content-Range头,确保覆盖完整的恶意代码
    • 示例: Content-Range: bytes 0-1000/1200
    • 实际恶意代码应小于1000字节
  3. 触发反序列化

    • 发送带有特定JSESSIONID的请求
    • 示例: Cookie: JSESSIONID=.poc

防御措施

  1. 禁用默认Servlet的写权限

    • 修改conf/web.xml中的DefaultServlet配置
    • 设置readonly为true
  2. 禁用部分PUT请求支持

    • 修改conf/web.xml中的DefaultServlet配置
    • 设置allowPartialPut为false
  3. 避免使用文件会话持久化

    • 考虑使用其他会话持久化机制
    • 或确保会话存储目录不可被外部访问
  4. 移除危险的反序列化库

    • 审查应用程序依赖
    • 移除或升级包含已知反序列化漏洞的库
  5. 更新Tomcat版本

    • 升级到不受影响的版本

技术深度解析

文件上传机制

Tomcat处理部分PUT请求时,会将上传的文件片段存储在临时目录中。攻击者可以精心构造文件名和路径,使文件被存储在会话持久化目录中。

会话持久化流程

  1. 启动时加载: Tomcat启动时会从持久化存储中加载session
  2. 请求时加载: 当请求中带有现有session ID时,会尝试从存储中加载
  3. 反序列化过程: 使用Java原生反序列化机制读取session文件

反序列化差异

StandardSession.readObjectData与普通readObject的主要区别在于:

  1. 包含Tomcat特定的session属性处理
  2. 有额外的验证逻辑
  3. 但仍然使用Java原生反序列化机制,因此无法防御恶意gadget链

研究价值

  1. 多阶段漏洞利用: 结合文件上传和反序列化两个阶段
  2. 默认配置问题: 虽然部分配置默认安全,但常见组合仍可导致漏洞
  3. 持久化机制滥用: 展示了持久化机制如何被攻击者利用

总结

CVE-2025-24813是一个典型的链式漏洞,结合了文件上传和反序列化两个安全问题。理解该漏洞需要掌握Tomcat的文件处理机制、会话管理架构以及Java反序列化原理。防御此类漏洞需要从配置管理和代码安全两方面入手,同时保持对依赖库的安全更新。

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时继续流程 swapIn loadSessionFromStore 最终触发反序列化 反序列化点 : 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反序列化原理。防御此类漏洞需要从配置管理和代码安全两方面入手,同时保持对依赖库的安全更新。