
phpMyAdmin 5.2.3 - Alta - Remota - 2FA skip - La cerimonia WebAuthn può essere saltata
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-webauthn
Classe: bypass 2FA Reach: Remoto
phpMyAdmin 5.2.3 (tag RELEASE_5_2_3). Tarball predefinito. web-auth/webauthn-lib è suggest / require-dev. composer install --no-dev non lo installa. createServer usa quindi CustomServer. Quella classe analizza response.signature (il campo deve esistere e decodificarsi) e non lo verifica mai tramite COSE. Non usa mai la credentialPublicKey memorizzata. Il CustomServerTest del prodotto stesso accetta un'asserzione senza chiave pubblica.
I controlli strutturali sono reali: credential id in allowCredentials, clientData.type == webauthn.get, challenge corrispondente alla sessione, host di origine, rpIdHash, user-present. La firma viene analizzata e ignorata. Dopo la password MySQL, una firma WebAuthn spazzatura che corrisponde comunque a quei campi è una sessione phpMyAdmin completa. Quello è il database. Se hai effettivamente installato web-auth/webauthn-lib, sei su WebauthnLibServer e non su questo bug.
| ID | nessuna CVE al momento |
| Classe | bypass 2FA / verifica della firma mancante |
| Reach | Remoto (login tramite cookie, poi WebAuthn saltato) |
| 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 |
| Prodotto | phpMyAdmin |
| Affetto | 5.2.3 tag RELEASE_5_2_3. Tarball predefinito / composer install --no-dev |
| Auth | Login tramite cookie (password MySQL), poi WebAuthn saltato |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1:18080 |
Ha comunque bisogno della password MySQL (login tramite cookie). Dopo quella password, invia in POST webauthn_request_response con challenge corrispondente, host di origine, rpIdHash, user-present, credential id registrato e una firma spazzatura. Atterra nella normale interfaccia. Il 2FA non c'è più. Quello è il database (SQL, utenti, export), non una shell PHP sull'host.
Se hai effettivamente installato web-auth/webauthn-lib, sei su WebauthnLibServer e non su questo bug.
| Privilegio | Metodo / percorso | Provato in lab o dedotto |
|---|---|---|
| Completare il 2FA WebAuthn senza l'autenticatore (integrità del secondo fattore) | POST webauthn_request_response dopo la password, firma spazzatura | Provato in lab. still_2fa=False landed=True |
| PMA completo come quell'utente MySQL (integrità + ricognizione del box SQL) | stessa sessione | Provato in lab. Marcatori della UI home presenti |
| Saltare la password MySQL | POST non autenticato | Provato in lab, chiuso. Rimane sulla pagina di login |
Stesso bypass con web-auth/webauthn-lib installato | WebauthnLibServer | Chiuso. Non è questo residuo |
| RCE sul sistema operativo / reverse shell | questo residuo | Chiuso |
Chiusi su questo residuo: PMA non autenticato, una shell PHP sull'host e il trattare un tarball che ha effettivamente installato web-auth/webauthn-lib come questo bug.
Ho letto createServer, poi parseAndValidateAssertionResponse, poi lo unit test che non passa una chiave pubblica. I controlli strutturali sono reali. La firma viene analizzata e ignorata.
Vicoli ciechi: inviare in POST il JSON WebAuthn senza una precedente sessione con password; una firma che non superava i controlli strutturali; Webauthn\Server ancora presente (classe server sbagliata); challenge non proveniente da questa sessione; host di origine non corrispondente; flag user-present non impostato; credential id non in allowCredentials.
Il Dockerfile del lab copia la 5.2.3, esegue composer install --no-dev, poi elimina vendor/web-auth così che CustomServer sia quello in gioco. L'ultimo php -r esce con 1 se Webauthn\Server esiste. init.sql registra il 2FA WebAuthn per appuser senza una chiave hardware. Il PoC invia in POST la firma not-a-real-signature-PMA-WEBAUTHN-BYPASS.
Clona il pin accanto al Dockerfile, poi esegui:
cd lab
git clone --depth 1 --branch RELEASE_5_2_3 https://github.com/phpmyadmin/phpmyadmin.git src
./run.sh
oppure dalla radice del pack dopo quel clone:
python3 phpmyadmin-webauthn-Abraxas-Labs.py
Solo loopback: http://127.0.0.1:18080. Progetto Compose pma-webauthn-lab. Pin RELEASE_5_2_3. Non distribuire src/. Witness PMA-WEBAUTHN-BYPASS.
SUCCESS PMA-WEBAUTHN-BYPASS WebAuthn 2FA accepted with garbage signature
Verifica authenticatorData || SHA-256(clientDataJSON) con la chiave pubblica COSE memorizzata; vincola userHandle; applica signCount. Rendi web-auth/webauthn-lib una dipendenza reale ed elimina CustomServer, oppure fallisci in modo sicuro se la libreria manca. Fino ad allora, disabilita il 2FA WebAuthn o non esporre questo phpMyAdmin.
Plugins\TwoFactor\WebAuthn::createServerCustomServer::parseAndValidateAssertionResponseGNU Affero GPL v3.0. Vedi LICENSE. Solo lab su loopback. Nessuna garanzia.