Apache Tomcat 远程代码执行漏洞(CVE-2025-24813)
一、漏洞概述
远程代码执行漏洞(CVE-2025-24813)源于Apache Tomcat的反序列化机制未对用户输入进行严格验证,攻击者可通过构造恶意序列化对象绕过安全限制,处理部分 PUT 请求时,攻击者利用临时文件路径处理中的缺陷(将路径分隔符"/"替换为“.”),通过特定条件(如启用默认 servlet 的写入功能)实现远程代码执行并控制服务器。
攻击者通过构造恶意的请求,利用特定配置文件会话持久机制,将恶意序列化数据写入服务器中,并在后续请求中触发反序列化操作,从而导致远程代码的执行。
二、影响版本
Tomcat 11.0.0-M1 至 11.0.2
Tomcat 10.1.0-M1 至 10.1.34
Tomcat 9.0.0.M1 至 9.0.98
三、利用条件
1、DefaultServlet 写入功能启用
Tomcat 默认禁用文件上传功能,需在web.xml中手动配置 readonly=false 参数方可开启文件写入权限。
2、Partial PUT 请求处理机制
应用支持了 partial PUT 请求,能够将恶意的序列化数据写入到会话文件中,该功能默认开启
3、文件会话持久化配置缺陷
应用使用了 Tomcat 的文件会话持久化并且使用了默认的会话存储位置,需在context.xml中进行配置。
4、脆弱依赖库引入攻击链
业务系统中若存在包含高危反序列化链的组件(如 Commons Collections 3.2.1 等),攻击者可通过加载恶意序列化数据触发远程代码执行。
漏洞复现
一、环境搭建
本次漏洞复现选择Tomcat9.0.98+JDK8,在阿里云服务器使用Docker进行环境搭建
1、拉取指定版本的Tomcat镜像
2、运行Tomcat容器,命名为tomcat9并将容器端口映射到宿主机
3、此时访问页面回显是404,因为Tomcat9镜像默认webapps目录为空,需进入容器终端,复制默认应用到 webapps 目录
4、访问云服务器公网ip 8899端口出现Tomcat页面即搭建成功
5、随后进入到容器终端,进入/usr/local/tomcat/webapps/ROOT/WEB-INF目录创建一个名为lib的文件夹,用于存放高危反序列化链的组件。
6、下载commons-collections-3.2.1.jar的反序列化链组件,上传至云服务器,并移动到lib目录下
7、修改context.xml配置文件内容,用于启用会话持久化到文件系统
8、修改web.xml配置文件内容,用于开启文件写入权限
9、修改server.xml配置文件内容,用于启用分块上传(可绕过文件完整性校验,触发文件持久化)
至此,漏洞环境配置完成
二、漏洞实现
- 生成一个恶意的序列化数据,可使用yakit自带的Yso-Java Hack,此处命令意思是进入到ROOT目录并执行ls命令,将结果写入到1.txt文件中
cd /usr/local/tomcat/webapps/ROOT && ls > 1.txt
2、使用以下数据包上传序列化数据,需要注意Range的分块值需要与Length保持一致,且大于当前文件的长度。发包时要进行Base64解码
3、进入到/usr/local/tomcat/work/Catalina/localhost/ROOT,查看文件列表,发包后比发包前多了一个.yth.session的临时文件,请求URL中的 / 替换成了 .
4、使用以下PoC,主动加载.yth.session文件,触发反序列化
5、此时,网站ROOT目录下已写入1.txt文件,并且可正常访问
至此,此漏洞成功复现
漏洞poc:
PUT /xxxxx/session HTTP/1.1
Host: ip:port
Content-Length: 1000
Content-Range: bytes 0-1000/1200
{{反序列化文件内容)}}
GET / HTTP/1.1
Host: ip:port
Cookie: JSESSIONID=.xxxxx