
phpMyAdmin 5.2.3 – Hoch – Remote – 2FA – config/set löscht Zwei-Faktor
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-config-set-2fa
Klasse: Privilegien-Überrest / fehlender Step-up Reichweite: Remote
phpMyAdmin 5.2.3 (RELEASE_5_2_3 / 962857e) - phpMyAdmin
POST index.php?route=/config/set schreibt jede allowlistete Präferenz, einschließlich 2fa. UserPreferences::persistOption führt keine Validierung durch. Einstellungen -> Zwei-Faktor ruft weiterhin TwoFactor::check(true) auf, bevor der Faktor entfernt wird. /config/set tut das nicht.
Eine angemeldete Sitzung oder XSS/CSRF, das das Seitentoken per POST senden kann, kann key=2fa und value=null senden. Der nächste Passwort-Login hat keine TOTP-, WebAuthn- oder Simple-Abfrage. Dauerhafte Entfernung, kein einmaliges Überspringen.
| ID | noch keine CVE |
| Klasse | Privilegien-Überrest / fehlender Step-up |
| Reichweite | Remote (authentifizierter Cookie-Login; CSRF-Token erforderlich) |
| CWE | CWE-620 |
| 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 (962857e4f63d42e38f11ff4d63f5e722018add76) |
| Auth | Cookie-Login. CSRF-Token erforderlich. Vollendet XSS oder CSRF zu einer dauerhaften 2FA-Entfernung |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1 |
2FA von einem phpMyAdmin-Konto entfernen, ohne TOTP, WebAuthn oder das Simple-Bestätigungsfeld vorzulegen. Der nächste Passwort-Login erfolgt nur mit Passwort. Volles PMA als dieser MySQL-Benutzer (SQL, Benutzer, Export).
| Privileg | Methode / Pfad | Recon / Integrität / Verfügbarkeit | Lab-bewiesen oder abgeleitet |
|---|---|---|---|
2fa auf null persistieren und den zweiten Faktor aus pmadb entfernen | Authentifiziertes POST index.php?route=/config/set key=2fa value=null plus ein gültiges token | Integrität des Präferenzspeichers | Lab-bewiesen. success:true, pmadb config_data wurde [] |
| Nach diesem Schreibvorgang nur mit Passwort anmelden | Neue Cookie-Sitzung, derselbe MySQL-Benutzer | Integrität des Login-Pfads | Lab-bewiesen. Kein 2fa_confirm, landete in der normalen UI |
| Die aktuelle Sitzung behalten, während 2FA für spätere Logins verschwindet | Derselbe Handler; persistOption schreibt den Speicher, nicht das Live-Flag two_factor_check | Integrität späterer Sitzungen | Lab-bewiesen. Sitzung A blieb drin. Sitzung B hatte 2FA gesehen. Sitzung C nicht |
| Verkettung von gespeichertem XSS oder CSRF, das mit dem Seitentoken per POST senden kann | Überreste aus derselben Prüfung, nicht dieses Lab | Integrität von 2FA nach einem Same-Origin-POST | Abgeleitet |
| 2FA über Einstellungen entfernen | POST /preferences/two-factor 2fa_remove=1 | Integrität von 2FA über die dokumentierte UI | Lab-bewiesen geschlossen. Ohne den Faktor zeigt PMA die Bestätigungsseite und pmadb hat weiterhin backend=simple |
Geschlossen bei diesem Überrest: unauthentifizierter Zugriff, Umgehung des MySQL-Passworts, OS-RCE, Lesen der pmadb-Zeilen anderer Benutzer. Ich brauchte Überrest #1 (CustomServer-Signatur) nicht. Ich habe das MySQL-Passwort nicht umgangen.
Gleicher Pin: WebAuthn CustomServer leftover.
Ich habe 5.2.3 nach PMASA-2025-1/2/3 gepinnt. Cookie-Auth, pmadb pma__userconfig. Das Lab aktiviert $cfg['DBG']['simple2fa'] nur, damit Einstellungen das Simple-Backend ohne Hardware-Schlüssel registrieren können. TOTP und WebAuthn liegen im selben 2fa-Präferenzschlüssel.
SetConfigController nimmt key und JSON value und ruft Config::setUserValue auf. UserPreferences::persistOption ist dokumentiert mit "No validation is done!" apply() allowlistet 2fa, damit der Schlüssel nicht als unbekannte Präferenz verworfen wird.
$result = $this->config->setUserValue(null, $key, json_decode($value));
json_decode('null') ist PHP null. persistOption('2fa', null, $default) hebt dann config_data['2fa'] auf, weil der Standardwert für diesen Pfad ebenfalls null ist.
Einstellungen -> Zwei-Faktor ist der Kontrast. TwoFactorController wird configure('') erst aufrufen, wenn TwoFactor::check(true) true zurückgibt.
Bereits festgehaltene Irrwege: Einstellungen 2fa_remove als die Lücke zu behandeln (es verlangt weiterhin den Faktor); unauthentifizierten Zugriff zu behaupten; eine Umgehung des MySQL-Passworts zu behaupten; dies als Überrest #1 (CustomServer) zu behandeln; eine Reverse Shell. Theater.
python3 phpmyadmin-config-set-2fa-Abraxas-Labs.py
# or: cd lab && ./run.sh
Ziel nur http://127.0.0.1:19280. Compose-Projekt phpmyadmin-config-set-2fa. Pin RELEASE_5_2_3. run.sh kopiert oder klont diesen Tag nach lab/src/ für das Image. Der Stack wird nach dem Lauf abgebaut.
Einstellungen registrierten Simple 2FA. Ein zweiter Browser rief die 2fa_confirm-Seite auf. POST 2fa_remove ohne den Faktor blieb auf der Bestätigungs-UI und ließ backend=simple in pmadb. POST /config/set gab dann success:true zurück, pmadb wurde [], und der nächste Login landete in der normalen UI.
SUCCESS phpmyadmin-config-set-2fa enroll=simple ui-remove-blocked=yes config-set-cleared=yes next-login-password-only=yes PMA-CONFIG-SET-2FA-WITNESS
2fa (und andere Auth-Schlüssel) auf /config/set verweigern. TwoFactor::check(true) vor jeder 2FA-Änderung verlangen. Den Einstellungen-Pfad als einzigen Schreiber beibehalten.
962857e4f63d42e38f11ff4d63f5e722018add76)libraries/classes/Controllers/Config/SetConfigController.phplibraries/classes/Config/UserPreferences.phpGNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.