
phpMyAdmin - Hoch 8.1 - Authentifizierter POST /index.php - 2FA-Umgehung
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · PMA-5.2.3-WebAuthn-2FA
phpMyAdmin 5.2.3 - phpMyAdmin
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 dekodierbar sein) und führt niemals eine COSE-Verifikation durch. Sie verwendet niemals den gespeicherten credentialPublicKey. Der eigene CustomServerTest des Produkts akzeptiert eine Assertion ohne öffentlichen Schlüssel.
Nach dem MySQL-Passwort ist eine unbrauchbare WebAuthn-Signatur, die dennoch zu Challenge, Origin, rpIdHash und user-present passt, eine vollständige phpMyAdmin-Sitzung. Das ist die Datenbank.
| ID | noch keine CVE |
| 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 Standard-Tarball (web-auth/webauthn-lib nicht vorhanden) |
| Auth | MySQL-Passwort, danach wird WebAuthn übersprungen |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1 |
Er benötigt weiterhin das MySQL-Passwort (Cookie-Login). Nach diesem Passwort sendet er per POST webauthn_request_response mit passender Challenge, passendem Origin-Host, rpIdHash, user-present, der registrierten Credential-ID und einer unbrauchbaren Signatur. Er landet in der normalen Oberfläche. Die 2FA ist weg. Das ist RCE auf den Daten, keine PHP-Shell auf dem Host.
Wenn Sie web-auth/webauthn-lib tatsächlich installiert haben, verwenden Sie WebauthnLibServer und sind von diesem Fehler nicht betroffen.
Ich habe createServer gelesen, dann parseAndValidateAssertionResponse, dann den Unit-Test, der keinen öffentlichen Schlüssel übergibt. Die strukturellen Prüfungen sind echt: Credential-ID in allowCredentials, clientData.type == webauthn.get, Challenge stimmt mit der Sitzung überein, Origin-Host, rpIdHash, user-present. Die Signatur wird geparst und ignoriert.
Der erste Client, den ich darauf ansetzte, war höflich. Er sendete per POST ein WebAuthn-JSON ohne vorherige Passwort-Sitzung. Login-Seite. Er sendete per POST route=/ mit einer Signatur, die nicht einmal die strukturellen Prüfungen erfüllte. Man bleibt bei der 2FA. webauthn_request_response steht weiterhin im HTML.
Bereits dokumentierte Irrwege: Webauthn\Server vorhanden (falsche Server-Klasse); Challenge nicht die aus dieser Sitzung; Origin-Host stimmt nicht überein; user-present-Flag nicht gesetzt; Credential-ID nicht in allowCredentials; nicht authentifiziert, kein MySQL-Passwort; eine Reverse Shell. Theater. Das Erkennungsmerkmal ist das verschwundene 2FA-Feld und eine phpMyAdmin-Navigationsseite.
Client-Fehler sehen wie Produktfehler aus. Ein Helper, der http.client überschattet, sendet nie ein Paket. .recv() auf einer HTTPResponse ist nicht .read(). Ich erwähne das einmal, weil es Zeit gekostet hat und für eine Minute so aussah, als wäre phpMyAdmin in Ordnung.
Dann: POST mit Benutzername/Passwort/Token. Die Sitzungs-Challenge von der 2FA-Seite holen. Die gefälschte Assertion per POST senden. still_2fa=False landed=True. Das Lab-Dockerfile kopiert 5.2.3, führt composer install --no-dev aus und löscht dann vendor/web-auth, damit CustomServer zum Einsatz kommt. Das letzte php -r endet mit Exit-Code 1, wenn Webauthn\Server existiert. Das Image muss den Build fehlschlagen lassen, wenn die Bibliothek noch vorhanden ist. init.sql registriert WebAuthn-2FA für appuser ohne Hardware-Schlüssel.
cd lab
./run.sh
Ziele ausschließlich auf http://127.0.0.1:18080. Platziere phpMyAdmin 5.2.3 als src/ neben dem Dockerfile.
password-login status=200 webauthn=True
2fa-post status=200 still_2fa=False landed=True
SUCCESS PMA-WEBAUTHN-BYPASS WebAuthn 2FA accepted with garbage signature
Installiere web-auth/webauthn-lib, damit createServer die Bibliothek verwendet, oder verifiziere response.signature tatsächlich per COSE gegen den gespeicherten öffentlichen Schlüssel in CustomServer. Bis dahin deaktiviere die WebAuthn-2FA oder stelle dieses phpMyAdmin nicht öffentlich bereit.
CustomServer::parseAndValidateAssertionResponse · WebAuthn::createServer · CustomServerTestGNU Affero GPL v3.0. Siehe LICENSE. Nur für Loopback-Labore. Keine Gewährleistung.