phpMyAdmin 5.2.3 — высокий — удалённый — 2FA — config/set очищает двухфакторную аутентификацию
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-config-set-2fa
Класс: Остаточные привилегии / отсутствие step-up Доступ: Удалённый
phpMyAdmin 5.2.3 (RELEASE_5_2_3 / 962857e) - phpMyAdmin
POST index.php?route=/config/set записывает любую настройку из белого списка, включая 2fa. UserPreferences::persistOption не выполняет никакой проверки. Settings -> Two-factor по-прежнему вызывает TwoFactor::check(true), прежде чем снять фактор. /config/set — нет.
Аутентифицированная сессия или XSS/CSRF, способный отправить POST с токеном страницы, может передать key=2fa и value=null. При следующем входе по паролю не будет запроса TOTP, WebAuthn или Simple. Устойчивое удаление, а не пропуск одного запроса.
| ID | CVE пока нет |
| Класс | Остаточные привилегии / отсутствие step-up |
| Доступ | Удалённый (аутентифицированный вход по cookie; требуется CSRF-токен) |
| CWE | CWE-620 |
| CVSS | High: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| Продукт | phpMyAdmin |
| Затронуто | 5.2.3 тег RELEASE_5_2_3 (962857e4f63d42e38f11ff4d63f5e722018add76) |
| Аутентификация | вход по cookie. Требуется CSRF-токен. Завершает XSS или CSRF до устойчивого удаления 2FA |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1 |
Удалить 2FA из учётной записи phpMyAdmin, не предъявляя TOTP, WebAuthn или поле подтверждения Simple. Следующий вход по паролю будет только по паролю. Полный PMA от имени этого пользователя MySQL (SQL, пользователи, экспорт).
| Привилегия | Метод / путь | Разведка / целостность / доступность | Доказано в лаборатории или выведено |
|---|---|---|---|
Сохранить 2fa как null и удалить второй фактор из pmadb | Аутентифицированный POST index.php?route=/config/set key=2fa value=null плюс валидный token | Целостность хранилища настроек | Доказано в лаборатории. success:true, pmadb config_data стал [] |
| Войти только по паролю после этой записи | Новая cookie-сессия, тот же пользователь MySQL | Целостность пути входа | Доказано в лаборатории. Без 2fa_confirm, попал в обычный UI |
| Сохранить текущую сессию, пока 2FA исчезает для последующих входов | Тот же обработчик; persistOption пишет в хранилище, а не в живой флаг two_factor_check | Целостность последующих сессий | Доказано в лаборатории. Сессия A осталась. Сессия B видела 2FA. Сессия C — нет |
| Цепочка от stored XSS или CSRF, способного отправить POST с токеном страницы | Остатки того же ревью, не эта лаборатория | Целостность 2FA после same-origin POST | Выведено |
| Удалить 2FA через Settings | POST /preferences/two-factor 2fa_remove=1 | Целостность 2FA через документированный UI | Доказано в лаборатории как закрытое. Без фактора PMA показывает страницу подтверждения, и pmadb всё ещё содержит backend=simple |
Закрыто в этом остатке: неаутентифицированный доступ, пропуск пароля MySQL, OS RCE, чтение строк pmadb других пользователей. Мне не понадобился остаток #1 (подпись CustomServer). Я не пропускал пароль MySQL.
Тот же пин: WebAuthn CustomServer leftover.
Я зафиксировал 5.2.3 после PMASA-2025-1/2/3. Аутентификация по cookie, pmadb pma__userconfig. Лаборатория включает $cfg['DBG']['simple2fa'] только для того, чтобы Settings могли зарегистрировать бэкенд Simple без аппаратного ключа. TOTP и WebAuthn живут в одном и том же ключе настройки 2fa.
SetConfigController принимает key и JSON value и вызывает Config::setUserValue. UserPreferences::persistOption документирован как "No validation is done!" apply() включает 2fa в белый список, поэтому ключ не отбрасывается как неизвестная настройка.
$result = $this->config->setUserValue(null, $key, json_decode($value));
json_decode('null') — это PHP null. persistOption('2fa', null, $default) затем удаляет config_data['2fa'], потому что значение по умолчанию для этого пути тоже null.
Settings -> Two-factor — это контраст. TwoFactorController не выполнит configure(''), пока TwoFactor::check(true) не вернёт true.
Уже зафиксированные неверные пути: считать Settings 2fa_remove дырой (он всё ещё требует фактор); заявлять о неаутентифицированном доступе; заявлять о пропуске пароля MySQL; считать это остатком #1 (CustomServer); reverse shell. Театр.
python3 phpmyadmin-config-set-2fa-Abraxas-Labs.py
# or: cd lab && ./run.sh
Цель только http://127.0.0.1:19280. Compose-проект phpmyadmin-config-set-2fa. Пин RELEASE_5_2_3. run.sh копирует или клонирует этот тег в lab/src/ для образа. Стек разбирается после запуска.
Settings зарегистрировали Simple 2FA. Второй браузер попал на страницу 2fa_confirm. POST 2fa_remove без фактора остался на UI подтверждения и оставил backend=simple в pmadb. Затем POST /config/set вернул success:true, pmadb стал [], и следующий вход попал в обычный UI.
SUCCESS phpmyadmin-config-set-2fa enroll=simple ui-remove-blocked=yes config-set-cleared=yes next-login-password-only=yes PMA-CONFIG-SET-2FA-WITNESS
Запретить 2fa (и другие ключи аутентификации) на /config/set. Требовать TwoFactor::check(true) перед любой мутацией 2FA. Оставить путь Settings единственным писателем.
962857e4f63d42e38f11ff4d63f5e722018add76)libraries/classes/Controllers/Config/SetConfigController.phplibraries/classes/Config/UserPreferences.phpGNU Affero GPL v3.0. См. LICENSE. Только loopback-лаборатория. Без гарантий.