安全检测 Strapi 实例是否受 CVE-2026-27886 影响,无需执行完整的账户接管流程。详见 Bishop Fox 博客上的 完整分析。
CVE-2026-27886 是 Strapi 版本 4.0.0 至 5.36.1 中的一个未认证参数清理绕过漏洞,允许远程未认证攻击者通过公共内容 API 泄露管理员机密。框架中的查询清理器 @strapi/utils 仅处理已记录的 filters、sort、fields 和 populate 查询键,而静默保留请求中所有其他顶级键。这些未知键随后会通过 transformQueryParams 传递,并最终作为 SQL WHERE 子句进入 strapi.db.query(...)。通过针对任何公共内容 API 集合探测 where[updatedBy][resetPasswordToken][$startsWith]=<prefix>,攻击者可以逐个字符地泄露管理员机密,并通过响应中的 meta.pagination.total 字段获取结果。
本工具通过以下方式进行非破坏性漏洞测试:
GET /api/<collection>GET 请求并附加 ?where[id][$lt]=-1meta.pagination.total 值,以判断 where 子句是否到达了数据库层where[id][$lt]=-1 谓词无法匹配任何真实行,因此当该子句在数据库层生效时,响应将收缩为零行。当补丁已应用时,未知的 where 键会被清理器的白名单丢弃,查询构建完成后返回的响应与基线相同。该探测从不触及私有管理员列,也不修改任何数据。
where 子句在数据库层生效。sanitizeQuery 会在到达数据库之前移除所有无法识别的顶级键。INCONCLUSIVE 结果。在有漏洞的服务器上,该工具随后会通过 where[updatedBy][email][$startsWith]=<prefix> 逐个字符地枚举管理员的电子邮件地址。它不会链接到管理员账户接管。
git clone https://github.com/BishopFox/CVE-2026-27886-check
cd CVE-2026-27886-check
无外部依赖。扫描仪仅使用 Python 标准库模块。
测试 Strapi 服务器的公共内容 API 集合端点。Strapi 将内容类型的 pluralName 映射到 URL 路径,因此确切名称因部署而异。
python3 CVE-2026-27886-check.py <ENDPOINT>
$ 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 = [email protected]
[+] 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
仅在满足以下条件时,该工具才能检测到漏洞:
find 权限updated_by_id 非空如果任何条件不满足,该工具将报告 INCONCLUSIVE 结果。
本代码基于 MIT 许可证 分发。
未经事先双方同意使用此工具攻击目标是非法的。最终用户有责任遵守所有适用的地方、州和联邦法律。开发者不承担任何责任,也不对因使用本程序造成的任何误用或损害负责。