
phpMyAdmin 5.2.3 — высокий — удалённый — обход 2FA — церемонию WebAuthn можно пропустить
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-webauthn
Класс: обход 2FA Доступ: удалённый
phpMyAdmin 5.2.3 (тег RELEASE_5_2_3). Стандартный tarball. web-auth/webauthn-lib находится в suggest / require-dev. composer install --no-dev его не устанавливает. Поэтому createServer использует CustomServer. Этот класс разбирает response.signature (поле должно существовать и декодироваться) и никогда не проверяет его через COSE. Он никогда не использует сохранённый credentialPublicKey. Собственный CustomServerTest продукта принимает assertion без публичного ключа.
Структурные проверки реальны: credential id в allowCredentials, clientData.type == webauthn.get, challenge совпадает с сессией, хост origin, rpIdHash, user-present. Подпись разбирается и игнорируется. После пароля MySQL мусорная подпись WebAuthn, которая всё ещё соответствует этим полям, даёт полноценную сессию phpMyAdmin. Это база данных. Если вы действительно установили web-auth/webauthn-lib, вы работаете через WebauthnLibServer, и это не данный баг.
| ID | CVE пока нет |
| Класс | обход 2FA / отсутствие проверки подписи |
| Доступ | Удалённый (вход по cookie, затем WebAuthn пропускается) |
| CWE | CWE-347, CWE-287 |
| 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. Стандартный tarball / composer install --no-dev |
| Аутентификация | Вход по cookie (пароль MySQL), затем WebAuthn пропускается |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1:18080 |
Ему всё ещё нужен пароль MySQL (вход по cookie). После этого пароля он отправляет POST webauthn_request_response с совпадающими challenge, хостом origin, rpIdHash, user-present, id зарегистрированного credential и мусорной подписью. Он попадает в обычный интерфейс. 2FA больше нет. Это база данных (SQL, пользователи, экспорт), а не PHP-шелл на хосте.
Если вы действительно установили web-auth/webauthn-lib, вы работаете через WebauthnLibServer, и это не данный баг.
| Привилегия | Метод / путь | Доказано в лаборатории или предположено |
|---|---|---|
| Полный обход WebAuthn 2FA без аутентификатора (целостность второго фактора) | POST webauthn_request_response после пароля, мусорная подпись | Доказано в лаборатории. still_2fa=False landed=True |
| Полный PMA от имени этого пользователя MySQL (целостность + разведка SQL-хоста) | та же сессия | Доказано в лаборатории. Присутствуют маркеры главного интерфейса |
| Обход пароля MySQL | неаутентифицированный POST | Доказано в лаборатории, закрыто. Остаётся на странице входа |
Тот же обход при установленном web-auth/webauthn-lib | WebauthnLibServer | Закрыто. Это не данный остаток |
| RCE на уровне ОС / reverse shell | данный остаток | Закрыто |
Закрыто на данном остатке: неаутентифицированный PMA, PHP-шелл на хосте и трактовка tarball, в котором действительно установлен web-auth/webauthn-lib, как данного бага.
Я прочитал createServer, затем parseAndValidateAssertionResponse, затем модульный тест, который не передаёт публичный ключ. Структурные проверки реальны. Подпись разбирается и игнорируется.
Неверные шаги: POST WebAuthn JSON без предварительной сессии с паролем; подпись, не прошедшая структурные проверки; Webauthn\Server всё ещё присутствует (неверный класс сервера); challenge не из этой сессии; несовпадение хоста origin; флаг user-present снят; credential id отсутствует в allowCredentials.
Dockerfile лаборатории копирует 5.2.3, выполняет composer install --no-dev, затем удаляет vendor/web-auth, чтобы использовался именно CustomServer. Последний php -r завершается с кодом 1, если Webauthn\Server существует. init.sql регистрирует WebAuthn 2FA для appuser без аппаратного ключа. PoC отправляет POST с подписью not-a-real-signature-PMA-WEBAUTHN-BYPASS.
Клонируйте закреплённую версию рядом с Dockerfile, затем выполните:
cd lab
git clone --depth 1 --branch RELEASE_5_2_3 https://github.com/phpmyadmin/phpmyadmin.git src
./run.sh
или из корня пакета после этого клонирования:
python3 phpmyadmin-webauthn-Abraxas-Labs.py
Только loopback: http://127.0.0.1:18080. Проект Compose pma-webauthn-lab. Закрепление RELEASE_5_2_3. Не поставляйте src/. Свидетельство PMA-WEBAUTHN-BYPASS.
SUCCESS PMA-WEBAUTHN-BYPASS WebAuthn 2FA accepted with garbage signature
Проверяйте authenticatorData || SHA-256(clientDataJSON) с помощью сохранённого публичного ключа COSE; привязывайте userHandle; применяйте signCount. Сделайте web-auth/webauthn-lib реальной зависимостью и удалите CustomServer, либо отказывайте при отсутствии библиотеки (fail closed). До этого отключите WebAuthn 2FA или не выставляйте этот phpMyAdmin наружу.
Plugins\TwoFactor\WebAuthn::createServerCustomServer::parseAndValidateAssertionResponseGNU Affero GPL v3.0. См. LICENSE. Только loopback-лаборатория. Без гарантий.