BishopFox/CVE-2026-27886-check
GitHub: BishopFox/CVE-2026-27886-check
一款用于检测 Strapi CMS 是否存在 CVE-2026-27886 未认证布尔型数据泄漏漏洞并枚举管理员邮箱的 Python 工具。
Stars: 1 | Forks: 1
# CVE-2026-27886 漏洞评估工具
安全检测 [Strapi](https://strapi.io/) 实例是否存在 CVE-2026-27886 漏洞,而无需执行完整的账户接管链。请参阅 Bishop Fox 博客上的 [完整分析文章](https://bishopfox.com/blog/cve-2026-27886-unauthenticated-boolean-oracle-exfiltration-of-administrator-secrets-in-strapi)。
## 描述
CVE-2026-27886 是 Strapi 版本 4.0.0 至 5.36.1 中存在的一个未经认证的参数消毒绕过漏洞,允许远程未认证攻击者通过公共 Content API 泄露管理员机密。框架的查询消毒器(位于 `@strapi/utils` 中)仅处理文档中定义的 `filters`、`sort`、`fields` 和 `populate` 查询键,并静默保留请求中的所有其他顶级键。这些未知键随后会被传递至 `transformQueryParams`,并最终进入 `strapi.db.query(...)` 作为 SQL WHERE 子句。攻击者通过对任意公共 Content API 集合执行 `?where[updatedBy][resetPasswordToken][$startsWith]=` 探查,即可通过响应中的 `meta.pagination.total` 字段逐字符泄露管理员机密。
本工具通过以下方式进行非破坏性漏洞检测:
1. 发送基线请求 `GET /api/`
2. 发送相同的 `GET` 请求,但附加 `?where[id][$lt]=-1`
3. 比较两次响应的 `meta.pagination.total` 值,以确定 `where` 子句是否到达了数据库层
`where[id][$lt]=-1` 条件无法匹配任何真实行,因此当该子句在数据库层生效时,响应会降至零行。若补丁已生效,未知的 `where` 键将在查询构建前被消毒器的允许列表移除,此时响应与基线完全相同。该探测从未触及私有管理员列,也从未修改任何数据。
* **易受攻击的服务器** 会返回不同的总数:基线返回至少一行,而带条件的请求返回零行,因为 `where` 子句在数据库层生效。
* **已打补丁的服务器**(Strapi 5.37.0 或更高版本)对两个请求返回相同的总数,因为 `sanitizeQuery` 会在它们到达数据库之前移除所有无法识别的顶级键。
* **非 Strapi 服务器、无法访问的端点或空集合** 将报告 `INCONCLUSIVE` 结果。
在易受攻击的服务器上,该工具随后会通过 `?where[updatedBy][email][$startsWith]=` 逐字符枚举管理员的电子邮件地址。它**不会**链式进行管理员账户接管。
## 安装
```
git clone https://github.com/BishopFox/CVE-2026-27886-check
cd CVE-2026-27886-check
```
无外部依赖。该扫描工具仅使用 Python 标准库模块。
## 使用方式
测试 Strapi 服务器的公共 Content API 集合端点。Strapi 将内容类型的 `pluralName` 映射到 URL 路径,因此具体名称因部署而异。
```
python3 CVE-2026-27886-check.py
```
### 示例:易受攻击的服务器
```
$ python3 CVE-2026-27886-check.py http://target.example.com/api/articles
[+] Target: http://target.example.com/api/articles
[+] Differential confirmed: baseline total=1, where-test total=0 -> VULNERABLE
[+] Enumerating admin email
admin email = admin@example.com
[+] Done. To remediate, upgrade to Strapi 5.37.0 or later.
```
### 示例:已打补丁的服务器
```
$ python3 CVE-2026-27886-check.py http://target.example.com/api/articles
[+] Target: http://target.example.com/api/articles
[+] Differential check: baseline total=1, where-test total=1 -> NOT VULNERABLE
```
## 前置条件
该工具只能在以下条件均满足时检测到漏洞:
* 目标运行的是 Strapi 4.0.0 至 5.36.1
* 公共角色已被授予至少一个内容类型的 `find` 权限
* 该内容类型中至少有一行的 `updated_by_id` 不为 NULL
* 目标集合 URL 可访问
若任一条件不满足,工具将报告 `INCONCLUSIVE` 结果。
## 许可证
本代码基于 [MIT 许可证](LICENSE) 分发。
## 法律免责声明
在未事先获得双方同意的情况下使用本工具攻击目标属于违法行为。最终用户有责任遵守所有适用的地方、州和联邦法律。开发者不承担任何责任,也不对因本程序引起的任何误用或损害负责。
## 参考
* [Strapi 安全公告 GHSA-rjg2-95x7-8qmx](https://github.com/strapi/strapi/security/advisories/GHSA-rjg2-95x7-8qmx)
* [Bishop Fox 博客:完整技术分析](https://bishopfox.com/blog/cve-2026-27886-unauthenticated-boolean-oracle-exfiltration-of-administrator-secrets-in-strapi)
* [NVD — CVE-2026-27886](https://nvd.nist.gov/vuln/detail/CVE-2026-27886)
标签:CMS安全, CVE-2026-27886, JavaScript, SQL注入绕过, Strapi, 代码生成, 公开服务利用, 参数消毒绕过, 安全, 布尔盲注, 未认证攻击, 渗透测试工具, 管理员秘密泄露, 网络安全, 超时处理, 逆向工具, 隐私保护