
phpMyAdmin 5.2.3 - Alta - Remota - SQLi - ImportLdi TERMINATED BY leftover
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-importldi
Write-up: https://abraxaslabs.tech/research/phpmyadmin-importldi
Classe: SQLi Portata: Remota
phpMyAdmin 5.2.3 (RELEASE_5_2_3 / 962857e) - phpMyAdmin
ImportLdi.php costruisce LOAD DATA con FIELDS/LINES TERMINATED BY a partire dai parametri POST ldi_terminated e ldi_new_line. Queste due stringhe vengono concatenate in SQL tra apici singoli. ldi_enclosed e ldi_escaped passano attraverso escapeString. phpMyAdmin imposta PMA_ENABLE_LDI su /import in modo che MYSQLI_OPT_LOCAL_INFILE sia attivo.
Un utente autenticato invia via POST format=ldi con un apice in ldi_terminated. Il LOAD DATA generato contiene il POST grezzo all'interno di TERMINATED BY. SQL injection sulla connessione dell'utente, non sull'utente di controllo.
| ID | nessuna CVE al momento |
| Classe | SQLi |
| Portata | Remota (login autenticato tramite cookie; importazione tabella, formato ldi) |
| CWE | CWE-89 |
| CVSS | Media: 6.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N |
| Prodotto | phpMyAdmin |
| Affetto | 5.2.3 tag RELEASE_5_2_3 (962857e4f63d42e38f11ff4d63f5e722018add76) |
| Auth | login autenticato tramite cookie. Importazione tabella, formato ldi |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Un utente phpMyAdmin autenticato che può aprire l'importazione di una tabella può iniettare SQL in LOAD DATA ... TERMINATED BY sulla propria connessione MySQL.
| Privilegio | Metodo / sink | Ricognizione / integrità / disponibilità | Provato in lab o dedotto |
|---|---|---|---|
Rompere il letterale FIELDS TERMINATED BY | POST index.php?route=/import format=ldi ldi_terminated con un apice | Integrità dell'istruzione costruita da PMA | Provato in lab. Riquadro SQL HTML: TERMINATED BY '',PMA-IMPORTLDI-WITNESS' |
Mantenere ENCLOSED BY in-band | Stesso POST, apice in ldi_enclosed | Controllo negativo | Provato in lab. ENCLOSED BY è sottoposto a escape |
| SQL aggiuntivo sulla connessione dell'utente (INTO OUTFILE / stacked se consentito) | Stesso sink una volta chiusa la stringa | Integrità della connessione dell'utente | Dedotto. Il lab si ferma al delimitatore rotto. Il valore predefinito di mysqli::query è a istruzione singola |
| Lettura/scrittura di file lato MySQL | Stesso LOAD DATA se l'account dispone di FILE o LOCAL INFILE verso il web server | Integrità dei file che mysqld può toccare | Dedotto. Non concesso qui. Non rivendicato |
Esclusi su questo lab: accesso non autenticato, utente di controllo / pmadb, LFI tramite include a livello di OS e lettura/scrittura vincolata a FILE. L'utente autenticato dispone già di un riquadro SQL; questo residuo è il delimitatore non sottoposto a escape all'interno di un'istruzione che PMA costruisce per lui.
Stesso pin: residuo WebAuthn CustomServer.
Ho fissato phpMyAdmin RELEASE_5_2_3. I plugin di importazione che costruiscono LOAD DATA a mano sono un audit sul quoting. Due dei quattro campi delimitatore erano sottoposti a escape. Due no:
$sql .= ' FIELDS TERMINATED BY \'' . $ldi_terminated . '\'';
...
$sql .= ' LINES TERMINATED BY \'' . $ldi_new_line . '\'';
ldi_enclosed / ldi_escaped chiamano $dbi->escapeString. Common.php imposta PMA_ENABLE_LDI su /import + format=ldi. Route GET|POST /import e GET|POST /table/import.
Vicoli ciechi già registrati: dichiarare LFI senza un grant FILE; considerare la casella SQL come il finding (ciò che resta è il delimitatore non escapato che PMA concatena); dichiarare control-user / pmadb; una reverse shell. Teatro.
python3 phpmyadmin-importldi-Abraxas-Labs.py
# or: cd lab && ./run.sh
Target solo http://127.0.0.1:19290. Immagini phpmyadmin:5.2.3 e mysql:8.0. Progetto Compose phpmyadmin-importldi. Lo stack viene smontato dopo l'esecuzione.
Login tramite cookie. POST /import con format=ldi e una virgoletta in ldi_terminated. Emesso LOAD DATA LOCAL INFILE ... INTO TABLE \ldi_target` FIELDS TERMINATED BY '',PMA-IMPORTLDI-WITNESS'. La stessa virgoletta in ldi_enclosedmemorizzata comeENCLOSED BYcon escape. Il codice sorgente fissato sull'immagine 5.2.3 contiene ancora'.$ldi_terminated.'e$dbi->escapeString($ldi_enclosed)`.
SUCCESS phpmyadmin-importldi pin=RELEASE_5_2_3 how=live TERMINATED-BY-raw ENCLOSED-escaped PMA-IMPORTLDI-WITNESS
escapeString su ldi_terminated e ldi_new_line, come per enclosed ed escaped. Cast a int di skip_queries.
962857e4f63d42e38f11ff4d63f5e722018add76)libraries/classes/Plugins/Import/ImportLdi.phpGNU Affero GPL v3.0. Vedi LICENSE. Solo per laboratorio loopback. Nessuna garanzia.