
phpMyAdmin 5.2.3 — высокий — удалённый — остаточный — проверка isSuperUser пропущена
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-issuperuser
Класс: Остаточные привилегии Доступ: Удалённый
phpMyAdmin 5.2.3 (RELEASE_5_2_3 / 962857e) - phpMyAdmin
DatabaseInterface::isSuperUser() — это не проверка SUPER / SYSTEM_USER. Это SELECT 1 FROM mysql.user LIMIT 1. Любая учётная запись, способная читать mysql.user, кэшируется как суперпользователь до конца сессии. $cfg['AllowUserDropDatabase'] по умолчанию имеет значение false. DestroyController, SqlController, ImportController и страница баз данных используют сокращение isSuperUser в обход этого флага.
Обход политики phpMyAdmin, а не новая привилегия MySQL. SELECT на mysql.user плюс DROP, и без SUPER, достаточно для Drop через PMA.
| ID | пока нет CVE |
| Класс | Остаточные привилегии |
| Доступ | Удалённый (аутентифицированный вход по cookie как учётная запись MySQL) |
| CWE | CWE-863 |
| CVSS | Средний: 6.3 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:L |
| Продукт | phpMyAdmin |
| Затронуто | 5.2.3 тег RELEASE_5_2_3 (962857e4f63d42e38f11ff4d63f5e722018add76) |
| Аутентификация | аутентифицированный вход по cookie как учётная запись MySQL |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1 |
Учётная запись MySQL, вошедшая в систему, которая может читать mysql.user (типичный SELECT для резервного копирования/мониторинга) плюс DROP, без SUPER, рассматривается как суперпользователь phpMyAdmin.
| Привилегия | Метод / точка срабатывания | Разведка / целостность / доступность | Доказано в лаборатории или выведено |
|---|---|---|---|
Обход $cfg['AllowUserDropDatabase']=false и отображение Drop на странице баз данных | GET index.php?route=/server/databases | Разведка UI Drop | Доказано в лаборатории. bulkActionDropButton / selected_dbs[] присутствуют для selectuser; отсутствуют для plaindrop |
| Удаление базы данных через обработчик destroy PMA | POST index.php?route=/server/databases/destroy selected_dbs[]=dropme ajax_request=true | Целостность / доступность этой базы данных | Доказано в лаборатории. JSON success:true, "1 database has been dropped successfully." dropme исчезла |
Выполнение DROP DATABASE из SQL-окна | POST index.php?route=/sql sql_query=DROP DATABASE \dropme_sql`` | Целостность / доступность этой базы данных | Доказано в лаборатории. База данных исчезла. Негативная учётная запись получает "DROP DATABASE statements are disabled." |
Разблокировка других экранов PMA, зависящих от isSuperUser() | Привилегии, репликация, статус, группы пользователей, движки, binlog, переменные | Разведка / целостность этих экранов | Выведено из мест вызова. Не проверялось |
Чтение mysql.user | MySQL SELECT, который PMA использует как оракул SUPER | Разведка каталога, который PMA ошибочно принимает за SUPER | Доказано в лаборатории. Именно этот грант остаточная привилегия ошибочно принимает за SUPER |
Закрыто в этой лаборатории: настоящий MySQL SUPER (SHOW GRANTS остаётся USAGE + DROP на таблицу + SELECT на mysql.user). FILE, GRANT OPTION, shutdown и ALL PRIVILEGES не предоставлены. Учётная запись с DROP, но без SELECT на mysql.user, всё ещё не может удалять через PMA. Это не новая привилегия MySQL и не RCE.
Тот же пин: WebAuthn CustomServer leftover.
Я зафиксировал phpMyAdmin RELEASE_5_2_3. Привилегированные проверки, которые говорят как SUPER, должны выглядеть как SUPER. Эта выглядит как SELECT из каталога:
$result = $this->tryQuery('SELECT 1 FROM mysql.user LIMIT 1');
$isSuperUser = false;
if ($result) {
$isSuperUser = (bool) $result->numRows();
}
SessionCache::set('is_superuser', $isSuperUser);
Проверки, использующие этот флаг вокруг AllowUserDropDatabase (по умолчанию false):
Controllers/Server/DatabasesController.php is_drop_allowedControllers/Server/Databases/DestroyController.php (AJAX destroy)Controllers/Sql/SqlController.php / Sql::hasNoRightsToDropDatabaseControllers/Import/ImportController.phpControllers/Database/OperationsController.phpУже зафиксированные ошибочные пути: заявление о настоящем MySQL SUPER; рассмотрение учётной записи только с DROP как бага (эта учётная запись — негативный контроль); раздувание этого до RCE; обратная оболочка. Театр.
python3 phpmyadmin-issuperuser-Abraxas-Labs.py
# or: cd lab && ./run.sh
Цель только http://127.0.0.1:19270. Образы phpmyadmin:5.2.3 и mysql:8.0. Проект Compose phpmyadmin-issuperuser. $cfg['AllowUserDropDatabase']=false. Стек разбирается после запуска.
selectuser имеет SELECT на mysql.user плюс DROP на dropme / dropme_sql, без SUPER. plaindrop имеет DROP только на nodropme. Страница баз данных отображает Drop для selectuser. POST /server/databases/destroy удаляет dropme. POST /sql с DROP DATABASE dropme_sql также выполняется. plaindrop всё ещё получил Error JSON от destroy и "DROP DATABASE statements are disabled" от /sql.
SUCCESS phpmyadmin-issuperuser drop-ui=yes destroy=ok sql-drop=ok grants-no-super=yes mysql.user-select=yes neg-drop-ui=no neg-destroy=denied PMA-ISSUPERUSER-WITNESS
Проверяйте настоящий SUPER / SYSTEM_USER через INFORMATION_SCHEMA или SHOW GRANTS. Сохраните отдельный флаг "может читать mysql.user" для UI, которому действительно нужен этот каталог. Не кэшируйте SELECT из каталога как суперпользователя.
962857e4f63d42e38f11ff4d63f5e722018add76)libraries/classes/DatabaseInterface.php isSuperUser()GNU Affero GPL v3.0. См. LICENSE. Только лаборатория на loopback. Без гарантий.