phpMyAdmin 5.2.3 – Hoch – Remote – SQLi – auth plugin identifier unquoted
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-auth-plugin-unquoted
Klasse: SQLi Reichweite: Remote
phpMyAdmin 5.2.3 (RELEASE_5_2_3 / 962857e) - phpMyAdmin
Passwort ändern ist standardmäßig aktiviert. UserPassword.php kopiert POST authentication_plugin in ALTER USER ... IDENTIFIED WITH ohne Allowlist und ohne Quoting. Benutzername, Host und Passwort in derselben Anweisung durchlaufen escapeString. Auf MySQL 8 wird die WITH-Klausel ausgegeben, wenn das übermittelte Plugin vom aktuellen abweicht.
Ein angemeldeter phpMyAdmin-Benutzer injiziert SQL in sein eigenes ALTER USER über das Formular zum Ändern des Passworts. Zusätzliches SQL im Plugin-Feld ist SQL, kein Plugin-Name.
| ID | noch keine CVE |
| Klasse | SQLi |
| Reichweite | Remote (authentifizierter Cookie-Login; Passwort ändern aktiv) |
| CWE | CWE-89 |
| 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 | authentifizierter Cookie-Login. $cfg['ShowChgPassword'] standardmäßig true. Auth-Typ ist nicht config |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1 |
Ein angemeldeter phpMyAdmin-Benutzer kann SQL in sein eigenes ALTER USER über das Formular zum Ändern des Passworts injizieren.
| Privileg | Methode / Sink | Recon / Integrität / Verfügbarkeit | Im Lab bewiesen oder abgeleitet |
|---|---|---|---|
Zusätzliches SQL in IDENTIFIED WITH senden | POST index.php?route=/user-password mit authentication_plugin | Integrität der von phpMyAdmin erstellten Anweisung | Im Lab bewiesen. Rohes POST sha256_password /*PMA-AUTH-PLUGIN-UNQUOTED-WITNESS*/ erscheint unquoted im SQL-Feld |
| MySQL das zusätzliche SQL als SQL parsen lassen | Dieselbe Anweisung erreicht mysqld | Integrität der Benutzerverbindung | Im Lab bewiesen. General Log behielt Plugin sha256_password und verwarf den Kommentar. 1227, weil dieser Benutzer kein CREATE USER hat |
| Zusätzliche Klauseln oder zusätzliche Konten, wenn der Breakout parst | Derselbe Sink; gestapelte Queries hängen vom Treiber ab | Integrität anderer Konten | Abgeleitet. Dieses Lab führt keine zweite Anweisung aus und erstellt kein weiteres Konto |
| Dieselbe Konkatenation bei Benutzer hinzufügen/bearbeiten | Privileges.php IDENTIFIED WITH / MariaDB VIA | Integrität der vom Grantor erstellten Anweisungen | Abgeleitetes Geschwister. Lab-POST ist nur Passwort ändern |
Auf diesem Pfad geschlossen: unauthentifizierte Nutzung (Cookie-Login erforderlich), config-auth (Passwort ändern ist ausgeblendet), RCE, erfolgreiche GRANT-lose Plugin-Änderung auf MySQL 8 (1227 ohne CREATE USER). Benutzername, Host und Passwort bleiben escaped. Eigenes Passwort benötigt kein GRANT; der Rest ist das unquoted Plugin-Feld, kein freier Plugin-Tausch.
Gleicher Pin: WebAuthn CustomServer leftover.
Ich habe phpmyadmin/phpmyadmin RELEASE_5_2_3 gepinnt. PMASA-2025-1/2/3 sind bereits in 5.2.2. Passwort ändern baut weiterhin:
return 'ALTER USER \'' . $dbi->escapeString($username)
. '\'@\'' . $dbi->escapeString($hostname)
. '\' IDENTIFIED WITH ' . $authPlugin . ' BY '
$authPlugin ist $_POST['authentication_plugin']. MySQL 5.7.37+ und 8.0 lassen WITH weg, es sei denn, das Plugin hat sich geändert. Sende einen anderen Namen per POST und die Klausel kommt zurück.
Bereits festgehaltene Irrwege: MySQL 1227 als Fehlschlag des Restes zu behandeln (es ist der Beweis, dass zusätzliches SQL geparst wurde); eine GRANT-lose Plugin-Änderung auf MySQL 8 zu behaupten; config-auth als im Scope zu behandeln; eine Reverse Shell. Theater.
python3 phpmyadmin-auth-plugin-unquoted-Abraxas-Labs.py
# or: cd lab && ./run.sh
Ziel nur http://127.0.0.1:19260. Images phpmyadmin:5.2.3 und mysql:8.0. Compose-Projekt phpmyadmin-auth-plugin-unquoted. Stack wird nach dem Lauf abgebaut.
Cookie-Login als appuser. POST /user-password mit authentication_plugin=sha256_password /*PMA-AUTH-PLUGIN-UNQUOTED-WITNESS*/. PMA SQL-Abfragefeld: ALTER USER 'appuser'@'%' IDENTIFIED WITH sha256_password /*PMA-AUTH-PLUGIN-UNQUOTED-WITNESS*/ BY '***'. MySQL General Log parst den Kommentar und speichert IDENTIFIED WITH 'sha256_password'. Benutzername ist gequotet.
SUCCESS phpmyadmin-auth-plugin-unquoted how=live unquoted=yes escaped-user=yes plugin=sha256_password PMA-AUTH-PLUGIN-UNQUOTED-WITNESS
Plugin-Namen aus SHOW PLUGINS per Allowlist zulassen. Niemals POST in IDENTIFIED WITH, VIA oder plugin= interpolieren.
962857e4f63d42e38f11ff4d63f5e722018add76)libraries/classes/UserPassword.phplibraries/classes/Server/Privileges.phpGNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.