
phpMyAdmin 5.2.3 — высокий — удалённый — SQLi — остаточный запрос central columns pmadb
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-pmadb-central-sqli
Разбор: https://abraxaslabs.tech/research/phpmyadmin-pmadb-central-sqli
Класс: SQLi Доступ: Удалённый
phpMyAdmin 5.2.3 (тег RELEASE_5_2_3, коммит 962857e). Central columns записывает col_extra, конкатенируя POST-параметры extra и attribute в SQL-литерал в одинарных кавычках через соединение control-user. Соседние поля проходят через escapeString. Эти два — нет.
Аутентифицированный пользователь отправляет POST на index.php?route=/database/central-columns с multi_edit_central_column_save=1 и кавычкой в field_attribute (или col_extra). Затем getInsertQuery / updateOneColumn выполняют эту строку от имени control user pma к таблице pma__central_columns. Этот аккаунт — пользователь хранилища конфигурации, а не SQL-сессия вошедшего пользователя.
CVE-2016-5703 касалась имени базы данных в central columns. Поля extra и attribute — это не та уязвимость.
| ID | CVE пока нет |
| Класс | SQLi (control-user к pma__central_columns) |
| Доступ | Удалённый (аутентифицированный вход по cookie; pmadb central columns включены) |
| CWE | CWE-89 |
| CVSS | Высокий: 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 (962857e) |
| Аутентификация | Аутентифицированный вход по cookie. pmadb central columns включены. |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1:19210 |
Аутентифицированный пользователь phpMyAdmin, имеющий доступ к Central columns, может внедрить SQL от имени control user к pma__central_columns.
| Привилегия | Метод / путь | Подтверждено в лаборатории или выведено |
|---|---|---|
| Сломать строку INSERT/UPDATE control-user (целостность SQL в pmadb) | POST index.php?route=/database/central-columns multi_edit_central_column_save=1 с кавычкой в field_attribute / col_extra | Подтверждено в лаборатории. JSON-ошибка #1064. Свидетельство PMA-PMADB-CENTRAL-SQLI-WITNESS в ошибке control-user |
| Сохранить соседние поля в in-band | Тот же POST, кавычка в field_name | Подтверждено в лаборатории. Строка сохраняется как neg'col. escapeString сработал |
| Читать или перезаписывать строки central-column других пользователей | Тот же sink, после закрытия строки | Выведено. Лаборатория останавливается на синтаксической ошибке; нет stacked query |
| Дополнительные запросы от имени control user | Тот же sink, если соединение control mysqli допускает multi-query | Выведено. По умолчанию mysqli::query выполняет один запрос. Здесь не включено |
Доступ к другим таблицам pmadb (bookmarks, history, pma__userconfig) | Только если возможны stacked queries или запись в стиле INTO | Выведено. Control user в этой лаборатории имеет только DML на phpmyadmin.* |
Закрыто в этой лаборатории: неаутентифицированный доступ, SQL-сессия вошедшего appuser (только appdb), OS shell и stacked queries. Функция не работает, если pmadb / central columns отключены (это FAIL, а не данная уязвимость).
Восемь параллельных поисков по исходникам RELEASE_5_2_3. Соседние поля в CentralColumns.php проходят через escapeString. Extra и attribute объединяются через implode в литерал в одинарных кавычках. CVE-2016-5703 касалась имени базы данных, а не этих столбцов.
Ложные пути: считать кавычку в field_name уязвимостью (она сохраняется как neg'col; это негативный результат); ожидать, что general log покажет неэкранированное свидетельство (INSERT падает с #1064 до успешной записи); считать отключённый pmadb данной уязвимостью (функция не работает).
python3 phpmyadmin-pmadb-central-sqli-Abraxas-Labs.py
или
cd lab
./run.sh
Только loopback: http://127.0.0.1:19210. Образы phpmyadmin:5.2.3 и mysql:8.0. Compose-проект phpmyadmin-pmadb-central-sqli. Свидетель PMA-PMADB-CENTRAL-SQLI-WITNESS.
SUCCESS phpmyadmin-pmadb-central-sqli how=live insert-syntax=yes field-name-escaped=yes general-log-unescaped=false error-has-witness=true PMA-PMADB-CENTRAL-SQLI-WITNESS
escapeString / quoteString(..., CONNECT_CONTROL) для extra и attribute. Разрешённый список: auto_increment, UNSIGNED, BINARY, UNSIGNED ZEROFILL и on update CURRENT_TIMESTAMP. quoteString в phpMyAdmin 6.x для JSON-блоба дизайнера — это исправленная форма для данного класса конкатенации в pmadb.
962857e)libraries/classes/Database/CentralColumns.php getInsertQuery / updateOneColumnControllers/Database/CentralColumnsController.php POST multi_edit_central_column_saveGET|POST /database/central-columnsGNU Affero GPL v3.0. См. LICENSE. Только для лабораторных испытаний через loopback. Без гарантий.