漏洞描述
该漏洞的核心在于不完整PUT请求上传时 Tomcat 会使用了一个基于用户提供的文件名和路径生成的临时文件,且路径分隔符被替换为 .
。
若同时满足以下条件,攻击者可执行任意代码:
-
默认 Servlet 启用了写权限(默认禁用)
-
启用了部分PUT请求支持(默认启用)
-
应用程序使用 Tomcat 的基于文件的会话持久化(默认存储位置)
-
应用程序包含可被利用于反序列化攻击的库
受影响版本
-
Apache Tomcat 11.0.0-M1 至 11.0.2
-
Apache Tomcat 10.1.0-M1 至 10.1.34
-
Apache Tomcat 9.0.0-M1 至 9.0.98
漏洞环境搭建
尝试使用 Tomcat 9.0.98 版本复现:https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.98/bin/apache-tomcat-9.0.98.zip
根据里利用条件描述:
- 需要在conf/web.xml中,将DefaultServlet的readonly配置为false,启用写入功能
xml
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>

- 需要在conf/context.xml中,开启File文件会话存储
xml
<Manager className="org.apache.catalina.session.PersistentManager">
<Store className="org.apache.catalina.session.FileStore"/>
</Manager>

-
PUT方法默认是启用状态
-
在项目包含可被利用于反序列化攻击的库(例如 Commons Collections 3.2.1)
下载 commons-collections-3.2.1.jar(https://mvnrepository.com/artifact/commons-collections/commons-collections/3.2.1)
将该 jar 包放入
\webapps\ROOT\WEB-INF\lib
目录下
利用条件准备完毕,启动 Tomcat 应用:.\bin\catalina.bat run
(若是在 Liunx/Mac 环境下改用 catalina.sh 启动),浏览器访问本地8080端口查看是否成功启动。
漏洞复现
参照@jweny大佬文章:https://forum.butian.net/article/674
使用 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:

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


当文件被上传成功后,大概30s之内payload会被自动触发,随之文件会被清除。
也可以使用以下poc直接触发:
GET / HTTP/1.1
Host: localhost:8080
Cookie: JSESSIONID=.poc

参考文章
https://forum.butian.net/article/674
https://lists.apache.org/thread/j5fkjv2k477os90nczf2v9l61fb0kkgq
https://www.bilibili.com/video/BV14dQjYcEc5/?spm_id_from=333.1007.top_right_bar_window_default_collection.content.click&vd_source=4558613fd07f85f0f4c56e4f927f88ee
https://avd.aliyun.com/detail?id=AVD-2025-24813×tamp__1384=Wqmx0D2DnDBGQ7KDsKo4Cw4xROjhiHqQkF4D
若有错误,欢迎指正!o( ̄▽ ̄)ブ