
phpMyAdmin 5.2.3 – Hoch – Remote – SQLi – ImportLdi TERMINATED BY leftover
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-importldi
Klasse: SQLi Reichweite: Remote
phpMyAdmin 5.2.3 (RELEASE_5_2_3 / 962857e) - phpMyAdmin
ImportLdi.php baut LOAD DATA mit FIELDS/LINES TERMINATED BY aus den POST-Parametern ldi_terminated und ldi_new_line. Diese beiden Strings werden in einfach-quotiertes SQL konkateniert. ldi_enclosed und ldi_escaped durchlaufen escapeString. phpMyAdmin setzt PMA_ENABLE_LDI auf /import, wodurch MYSQLI_OPT_LOCAL_INFILE aktiviert wird.
Ein angemeldeter Benutzer sendet per POST format=ldi mit einem Anführungszeichen in ldi_terminated. Das ausgegebene LOAD DATA enthält den rohen POST-Inhalt innerhalb von TERMINATED BY. SQL-Injection in die Benutzerverbindung, nicht in den Control-User.
| ID | noch keine CVE |
| Klasse | SQLi |
| Reichweite | Remote (authentifizierter Cookie-Login; Tabellenimport, Format ldi) |
| CWE | CWE-89 |
| CVSS | Medium: 6.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N |
| Produkt | phpMyAdmin |
| Betroffen | 5.2.3 Tag RELEASE_5_2_3 (962857e4f63d42e38f11ff4d63f5e722018add76) |
| Auth | authentifizierter Cookie-Login. Tabellenimport, Format ldi |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1 |
Ein angemeldeter phpMyAdmin-Benutzer, der den Tabellenimport öffnen kann, kann SQL in LOAD DATA ... TERMINATED BY auf seiner MySQL-Verbindung injizieren.
| Privileg | Methode / Sink | Recon / Integrität / Verfügbarkeit | Im Lab nachgewiesen oder abgeleitet |
|---|---|---|---|
Das Literal FIELDS TERMINATED BY aufbrechen | POST index.php?route=/import format=ldi ldi_terminated mit einem Anführungszeichen | Integrität der von PMA erzeugten Anweisung | Im Lab nachgewiesen. HTML-SQL-Box: TERMINATED BY '',PMA-IMPORTLDI-WITNESS' |
ENCLOSED BY in-band halten | Derselbe POST, Anführungszeichen in ldi_enclosed | Negativkontrolle | Im Lab nachgewiesen. ENCLOSED BY wird escaped |
| Zusätzliches SQL auf der Benutzerverbindung (INTO OUTFILE / stacked falls erlaubt) | Derselbe Sink, sobald der String geschlossen ist | Integrität der Benutzerverbindung | Abgeleitet. Das Lab stoppt beim aufgebrochenen Delimiter. Standard-mysqli::query ist single-statement |
| Datei-Lesen/-Schreiben auf MySQL-Seite | Dasselbe LOAD DATA, falls das Konto FILE oder LOCAL INFILE zum Webserver hat | Integrität von Dateien, die mysqld berühren kann | Abgeleitet. Hier nicht gewährt. Nicht beansprucht |
In diesem Lab ausgeschlossen: unauthentifizierter Zugriff, Control-User / pmadb, OS-include-LFI und FILE-gesteuertes Lesen/Schreiben. Der angemeldete Benutzer hat bereits eine SQL-Box; dieser Rest ist der nicht escaped Delimiter innerhalb einer Anweisung, die PMA für ihn baut.
Gleicher Pin: WebAuthn CustomServer leftover.
Ich habe phpMyAdmin RELEASE_5_2_3 gepinnt. Import-Plugins, die LOAD DATA von Hand bauen, sind ein Quoting-Audit. Zwei von vier Delimiter-Feldern waren escaped. Zwei nicht:
$sql .= ' FIELDS TERMINATED BY \'' . $ldi_terminated . '\'';
...
$sql .= ' LINES TERMINATED BY \'' . $ldi_new_line . '\'';
ldi_enclosed / ldi_escaped rufen $dbi->escapeString auf. Common.php setzt PMA_ENABLE_LDI auf /import + format=ldi. Routen GET|POST /import und GET|POST /table/import.
Bereits dokumentierte Irrwege: LFI ohne FILE-Grant behaupten; die SQL-Box als den Fund behandeln (der Rest ist der nicht escaped Delimiter, den PMA konkateniert); Control-User / pmadb behaupten; eine Reverse Shell. Theater.
python3 phpmyadmin-importldi-Abraxas-Labs.py
# or: cd lab && ./run.sh
Ziel nur http://127.0.0.1:19290. Images phpmyadmin:5.2.3 und mysql:8.0. Compose-Projekt phpmyadmin-importldi. Der Stack wird nach dem Lauf abgebaut.
Cookie-Login. POST /import mit format=ldi und einem Anführungszeichen in ldi_terminated. Ausgegebenes LOAD DATA LOCAL INFILE ... INTO TABLE \ldi_target` FIELDS TERMINATED BY '',PMA-IMPORTLDI-WITNESS'. Dasselbe Anführungszeichen in ldi_enclosedwird als escapedENCLOSED BYgespeichert. Der Pin-Quellcode auf dem 5.2.3-Image enthält weiterhin'.$ldi_terminated.'und$dbi->escapeString($ldi_enclosed)`.
SUCCESS phpmyadmin-importldi pin=RELEASE_5_2_3 how=live TERMINATED-BY-raw ENCLOSED-escaped PMA-IMPORTLDI-WITNESS
escapeString auf ldi_terminated und ldi_new_line, genau wie bei enclosed und escaped. Int-Cast für skip_queries.
962857e4f63d42e38f11ff4d63f5e722018add76)libraries/classes/Plugins/Import/ImportLdi.phpGNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.