phpMyAdmin 5.2.3 – Hoch – Remote – SQLi – auth plugin identifier unquoted
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-auth-plugin-unquoted
Write-up: https://abraxaslabs.tech/research/phpmyadmin-auth-plugin-unquoted
Klasse: SQLi Reichweite: Remote
phpMyAdmin 5.2.3 (RELEASE_5_2_3 / 962857e) - phpMyAdmin
Die Passwortänderung ist standardmäßig aktiviert. UserPassword.php kopiert das POST-Feld authentication_plugin in ALTER USER ... IDENTIFIED WITH, ohne Allowlist und ohne Quoting. Benutzername, Host und Passwort in derselben Anweisung durchlaufen escapeString. Unter 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 zur Passwortänderung. Zusätzliches SQL im Plugin-Feld ist SQL, kein Plugin-Name.
| ID | noch keine CVE |
| Klasse | SQLi |
| Reichweite | Remote (authentifizierter Cookie-Login; Passwortänderung aktiviert) |
| 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 über das Formular zur Passwortänderung SQL in sein eigenes ALTER USER injizieren.
| Berechtigung | Methode / Sink | Recon / Integrität / Verfügbarkeit | Im Lab nachgewiesen oder abgeleitet |
|---|---|---|---|
Zusätzliches SQL in IDENTIFIED WITH senden | POST index.php?route=/user-password mit authentication_plugin | Integrität der von phpMyAdmin erzeugten Anweisung | Im Lab nachgewiesen. Rohes POST sha256_password /*PMA-AUTH-PLUGIN-UNQUOTED-WITNESS*/ erscheint ohne Quoting im SQL-Feld |
| MySQL das zusätzliche SQL als SQL parsen lassen | Dieselbe Anweisung erreicht mysqld | Integrität der Benutzerverbindung | Im Lab nachgewiesen. Das General Log behielt das Plugin sha256_password und verwarf den Kommentar. 1227, weil dieser Benutzer kein CREATE USER hat |
| Zusätzliche Klauseln oder zusätzliche Konten, falls der Ausbruch parst | Derselbe Sink; gestapelte Abfragen hängen vom Treiber ab | Integrität anderer Konten | Abgeleitet. Dieses Lab führt keine zweite Anweisung aus und legt kein weiteres Konto an |
| Dieselbe Verkettung bei Benutzer hinzufügen/bearbeiten | Privileges.php IDENTIFIED WITH / MariaDB VIA | Integrität der vom Grantor erzeugten Anweisungen | Abgeleitetes Geschwister. Das Lab-POST betrifft nur die Passwortänderung |
Auf diesem Pfad ausgeschlossen: unauthentifizierte Nutzung (Cookie-Login erforderlich), config-Auth (Passwortänderung ist ausgeblendet), RCE, erfolgreiche Plugin-Änderung ohne GRANT unter MySQL 8 (1227 ohne CREATE USER). Benutzername, Host und Passwort bleiben escaped. Das eigene Passwort benötigt kein GRANT; übrig bleibt das unquotierte Plugin-Feld, kein freier Plugin-Austausch.
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 enthalten. Die Passwortänderung erzeugt 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 wurde geändert. Sende einen anderen Namen per POST und die Klausel erscheint wieder.
Bereits festgehaltene Fehlversuche: 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 Geltungsbereich zu behandeln; eine Reverse Shell. Theater.
python3 phpmyadmin-auth-plugin-unquoted-Abraxas-Labs.py
# or: cd lab && ./run.sh
Nur http://127.0.0.1:19260 anvisieren. Images phpmyadmin:5.2.3 und mysql:8.0. Compose-Projekt phpmyadmin-auth-plugin-unquoted. Der 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 '***'. Das MySQL-General-Log parst den Kommentar und speichert IDENTIFIED WITH 'sha256_password'. Der Benutzername ist in Anführungszeichen gesetzt.
SUCCESS phpmyadmin-auth-plugin-unquoted how=live unquoted=yes escaped-user=yes plugin=sha256_password PMA-AUTH-PLUGIN-UNQUOTED-WITNESS
Erlauben Sie Plugin-Namen aus SHOW PLUGINS per Allowlist. Fügen Sie niemals POST-Werte in IDENTIFIED WITH, VIA oder plugin= ein.
962857e4f63d42e38f11ff4d63f5e722018add76)libraries/classes/UserPassword.phplibraries/classes/Server/Privileges.phpGNU Affero GPL v3.0. Siehe LICENSE. Nur für Loopback-Labore. Keine Gewährleistung.