
phpMyAdmin 5.2.3 - Alta - Remota - SQLi - ImportLdi TERMINATED BY leftover
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-importldi
Classe: SQLi Reach: Remoto
phpMyAdmin 5.2.3 (RELEASE_5_2_3 / 962857e) - phpMyAdmin
ImportLdi.php costruisce LOAD DATA con FIELDS/LINES TERMINATED BY a partire dai 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 in POST format=ldi con un apice in ldi_terminated. Il LOAD DATA emesso contiene il POST grezzo all'interno di TERMINATED BY. SQL injection nella connessione dell'utente, non in quella di controllo.
| ID | nessuna CVE al momento |
| Classe | SQLi |
| Reach | Remoto (login autenticato tramite cookie; import tabella, formato ldi) |
| CWE | CWE-89 |
| CVSS | Medio: 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. Import tabella, formato ldi |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Un utente phpMyAdmin autenticato che può aprire Import tabella può iniettare SQL in LOAD DATA ... TERMINATED BY sulla propria connessione MySQL.
| Privilegio | Metodo / sink | Recon / 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 che PMA costruisce | Provato in lab. Box 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 è escapato |
| 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 default mysqli::query è single-statement |
| Lettura/scrittura file lato MySQL | Stesso LOAD DATA se l'account ha 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, control-user / pmadb, LFI tramite include dell'OS, e lettura/scrittura vincolata a FILE. L'utente autenticato ha già un box SQL; questo residuo è il delimitatore non escapato all'interno di un'istruzione che PMA costruisce per lui.
Stesso pin: WebAuthn CustomServer leftover.
Ho fissato phpMyAdmin RELEASE_5_2_3. I plugin di import che costruiscono LOAD DATA a mano sono un audit di quoting. Due dei quattro campi delimitatore erano escapati. 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: rivendicare LFI senza un grant FILE; trattare il box SQL come il finding (il residuo è il delimitatore non escapato che PMA concatena); rivendicare 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 un apice in ldi_terminated. Emesso LOAD DATA LOCAL INFILE ... INTO TABLE \ldi_target` FIELDS TERMINATED BY '',PMA-IMPORTLDI-WITNESS'. Lo stesso apice in ldi_enclosedmemorizzato comeENCLOSED BYescapato. Il sorgente fissato sull'immagine 5.2.3 ha 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 per skip_queries.
962857e4f63d42e38f11ff4d63f5e722018add76)libraries/classes/Plugins/Import/ImportLdi.phpGNU Affero GPL v3.0. Vedi LICENSE. Solo lab su loopback. Nessuna garanzia.