
phpMyAdmin 5.2.3 – Hoch – Remote – 2FA-Überspringen – WebAuthn-Zeremonie kann übersprungen werden
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-webauthn
Klasse: 2FA-Bypass Reichweite: Remote
phpMyAdmin 5.2.3 (Tag RELEASE_5_2_3). Standard-Tarball. web-auth/webauthn-lib ist suggest / require-dev. composer install --no-dev installiert es nicht. createServer verwendet daher CustomServer. Diese Klasse parst response.signature (das Feld muss existieren und dekodieren) und führt niemals eine COSE-Verifikation durch. Sie verwendet niemals den gespeicherten credentialPublicKey. Der eigene CustomServerTest des Produkts akzeptiert eine Assertion ohne Public Key.
Strukturelle Prüfungen sind echt: Credential-ID in allowCredentials, clientData.type == webauthn.get, Challenge stimmt mit Session überein, Origin-Host, rpIdHash, User-Present. Die Signatur wird geparst und ignoriert. Nach dem MySQL-Passwort ist eine Müll-WebAuthn-Signatur, die noch zu diesen Feldern passt, eine vollständige phpMyAdmin-Session. Das ist die Datenbank. Wenn Sie tatsächlich web-auth/webauthn-lib installiert haben, sind Sie auf WebauthnLibServer und nicht von diesem Bug betroffen.
| ID | noch keine CVE |
| Klasse | 2FA-Bypass / fehlende Signaturverifikation |
| Reichweite | Remote (Cookie-Login, dann WebAuthn übersprungen) |
| CWE | CWE-347, CWE-287 |
| CVSS | Hoch: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| Produkt | phpMyAdmin |
| Betroffen | 5.2.3 Tag RELEASE_5_2_3. Standard-Tarball / composer install --no-dev |
| Auth | Cookie-Login (MySQL-Passwort), dann WebAuthn übersprungen |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1:18080 |
Er benötigt weiterhin das MySQL-Passwort (Cookie-Login). Nach diesem Passwort sendet er webauthn_request_response per POST mit passender Challenge, Origin-Host, rpIdHash, User-Present, registrierter Credential-ID und einer Müll-Signatur. Er landet in der normalen UI. 2FA ist weg. Das ist die Datenbank (SQL, Benutzer, Export), keine PHP-Shell auf dem Host.
Wenn Sie tatsächlich web-auth/webauthn-lib installiert haben, sind Sie auf WebauthnLibServer und nicht von diesem Bug betroffen.
| Privileg | Methode / Pfad | Im Lab bewiesen oder abgeleitet |
|---|---|---|
| Vollständige WebAuthn-2FA ohne den Authenticator (Integrität des zweiten Faktors) | POST webauthn_request_response nach Passwort, Müll-Signatur | Im Lab bewiesen. still_2fa=False landed=True |
| Vollständiges PMA als dieser MySQL-Benutzer (Integrität + Recon der SQL-Box) | dieselbe Session | Im Lab bewiesen. Home-UI-Marker vorhanden |
| MySQL-Passwort überspringen | unauthentifizierter POST | Im Lab bewiesen geschlossen. Bleibt auf Login |
Derselbe Bypass mit installiertem web-auth/webauthn-lib | WebauthnLibServer | Geschlossen. Nicht dieser Leftover |
| OS-RCE / Reverse Shell | dieser Leftover | Geschlossen |
Geschlossen bei diesem Leftover: unauthentifiziertes PMA, eine PHP-Shell auf dem Host und die Behandlung eines Tarballs, der tatsächlich web-auth/webauthn-lib installiert hat, als dieser Bug.
Ich las createServer, dann parseAndValidateAssertionResponse, dann den Unit-Test, der keinen Public Key übergibt. Strukturelle Prüfungen sind echt. Die Signatur wird geparst und ignoriert.
Irrwege: POSTen von WebAuthn-JSON ohne vorherige Passwort-Session; eine Signatur, die die strukturellen Prüfungen nicht bestand; Webauthn\Server noch vorhanden (falsche Server-Klasse); Challenge nicht aus dieser Session; Origin-Host-Mismatch; User-Present-Flag nicht gesetzt; Credential-ID nicht in allowCredentials.
Das Lab-Dockerfile kopiert 5.2.3, composer install --no-dev, löscht dann vendor/web-auth, damit CustomServer derjenige ist, der zum Einsatz kommt. Das letzte php -r beendet mit 1, wenn Webauthn\Server existiert. init.sql registriert WebAuthn-2FA für appuser ohne Hardware-Key. Das PoC sendet per POST die Signatur not-a-real-signature-PMA-WEBAUTHN-BYPASS.
Klonen Sie den Pin neben das Dockerfile, dann führen Sie aus:
cd lab
git clone --depth 1 --branch RELEASE_5_2_3 https://github.com/phpmyadmin/phpmyadmin.git src
./run.sh
oder aus dem Pack-Root nach diesem Clone:
python3 phpmyadmin-webauthn-Abraxas-Labs.py
Nur Loopback: http://127.0.0.1:18080. Compose-Projekt pma-webauthn-lab. Pin RELEASE_5_2_3. src/ nicht ausliefern. Witness PMA-WEBAUTHN-BYPASS.
SUCCESS PMA-WEBAUTHN-BYPASS WebAuthn 2FA accepted with garbage signature
Verifizieren Sie authenticatorData || SHA-256(clientDataJSON) mit dem gespeicherten COSE-Public-Key; binden Sie userHandle; erzwingen Sie signCount. Machen Sie web-auth/webauthn-lib zu einer echten Abhängigkeit und löschen Sie CustomServer, oder schlagen Sie fail-closed fehl, wenn die Bibliothek fehlt. Bis dahin deaktivieren Sie WebAuthn-2FA oder exponieren Sie dieses phpMyAdmin nicht.
Plugins\TwoFactor\WebAuthn::createServerCustomServer::parseAndValidateAssertionResponseGNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.