
phpMyAdmin 5.2.3 - Alta - Remota - Omisión de 2FA - Se puede omitir la ceremonia de WebAuthn
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-webauthn
Clase: bypass de 2FA Alcance: Remoto
phpMyAdmin 5.2.3 (tag RELEASE_5_2_3). Tarball por defecto. web-auth/webauthn-lib es suggest / require-dev. composer install --no-dev no lo instala. Por lo tanto createServer usa CustomServer. Esa clase parsea response.signature (el campo debe existir y decodificar) y nunca lo verifica con COSE. Nunca usa la credentialPublicKey almacenada. El propio CustomServerTest del producto acepta una aserción sin clave pública.
Las comprobaciones estructurales son reales: credential id en allowCredentials, clientData.type == webauthn.get, challenge coincide con la sesión, host de origen, rpIdHash, user-present. La firma se parsea y se ignora. Tras la contraseña de MySQL, una firma WebAuthn basura que aún coincida con esos campos es una sesión completa de phpMyAdmin. Eso es la base de datos. Si realmente instalaste web-auth/webauthn-lib, estás en WebauthnLibServer y no en este bug.
| ID | sin CVE todavía |
| Clase | bypass de 2FA / verificación de firma ausente |
| Alcance | Remoto (login por cookie, luego WebAuthn omitido) |
| CWE | CWE-347, CWE-287 |
| CVSS | Alto: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| Producto | phpMyAdmin |
| Afectado | 5.2.3 tag RELEASE_5_2_3. Tarball por defecto / composer install --no-dev |
| Auth | Login por cookie (contraseña de MySQL), luego WebAuthn omitido |
| Licencia | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1:18080 |
Todavía necesita la contraseña de MySQL (login por cookie). Tras esa contraseña, hace POST de webauthn_request_response con challenge coincidente, host de origen, rpIdHash, user-present, credential id enrolado y una firma basura. Aterrizan en la UI normal. El 2FA desaparece. Eso es la base de datos (SQL, usuarios, export), no una shell PHP en el host.
Si realmente instalaste web-auth/webauthn-lib, estás en WebauthnLibServer y no en este bug.
| Privilegio | Método / ruta | Probado en lab o inferido |
|---|---|---|
| Completar el 2FA WebAuthn sin el autenticador (integridad del segundo factor) | POST webauthn_request_response tras la contraseña, firma basura | Probado en lab. still_2fa=False landed=True |
| PMA completo como ese usuario de MySQL (integridad + reconocimiento de la caja SQL) | misma sesión | Probado en lab. Marcadores de la UI Home presentes |
| Omitir la contraseña de MySQL | POST no autenticado | Probado en lab, cerrado. Se queda en el login |
Mismo bypass con web-auth/webauthn-lib instalado | WebauthnLibServer | Cerrado. No es este remanente |
| RCE del SO / reverse shell | este remanente | Cerrado |
Cerrado en este remanente: PMA no autenticado, una shell PHP en el host, y tratar un tarball que realmente instaló web-auth/webauthn-lib como este bug.
Leí createServer, luego parseAndValidateAssertionResponse, luego el test unitario que no pasa una clave pública. Las comprobaciones estructurales son reales. La firma se parsea y se ignora.
Caminos equivocados: hacer POST de JSON WebAuthn sin una sesión de contraseña previa; una firma que falló las comprobaciones estructurales; Webauthn\Server todavía presente (clase de servidor equivocada); challenge que no era de esta sesión; host de origen no coincidente; flag user-present sin activar; credential id que no estaba en allowCredentials.
El Dockerfile del lab copia 5.2.3, composer install --no-dev, luego borra vendor/web-auth para que CustomServer sea el que está en juego. El último php -r sale con 1 si existe Webauthn\Server. init.sql enrola el 2FA WebAuthn para appuser sin una llave de hardware. El PoC hace POST de la firma not-a-real-signature-PMA-WEBAUTHN-BYPASS.
Clona el pin junto al Dockerfile, luego ejecuta:
cd lab
git clone --depth 1 --branch RELEASE_5_2_3 https://github.com/phpmyadmin/phpmyadmin.git src
./run.sh
o desde la raíz del pack tras ese clone:
python3 phpmyadmin-webauthn-Abraxas-Labs.py
Solo loopback: http://127.0.0.1:18080. Proyecto de Compose pma-webauthn-lab. Pin RELEASE_5_2_3. No distribuyas src/. Testigo PMA-WEBAUTHN-BYPASS.
SUCCESS PMA-WEBAUTHN-BYPASS WebAuthn 2FA accepted with garbage signature
Verifica authenticatorData || SHA-256(clientDataJSON) con la clave pública COSE almacenada; vincula userHandle; aplica signCount. Haz que web-auth/webauthn-lib sea una dependencia real y elimina CustomServer, o falla en cerrado si falta la librería. Hasta entonces, desactiva el 2FA WebAuthn o no expongas este phpMyAdmin.
Plugins\TwoFactor\WebAuthn::createServerCustomServer::parseAndValidateAssertionResponseGNU Affero GPL v3.0. Ver LICENSE. Solo lab en loopback. Sin garantía.