Ho riscontrato una situazione particolarmente strana in cui ho una vulnerabilità di SQL Injection nella clausola ORDER BY. La query è forgiata sul backend e il payload dell'iniezione viene convertito in maiuscolo con la funzione PHP strtoupper()
come può essere visto sotto:
$sql="select something from table order by ".strtoupper($injection);
Il problema è che posso estrarre da information_schema e nomi di variabili, ma non posso estrarre dati da altre tabelle perché il nome della tabella nella query di selezione è definito in lettere minuscole.
Ad esempio:
SELECT * FROM mysql.user -- Will work.
SELECT * FROM MYSQL.USER -- Cannot find MYSQL.USER.
Apparentemente, INFROMATION_SCHEMA
è la stessa cosa di information_schema
. Ma questo non vale anche per le altre tabelle.
Per estrarre i dati ho usato la seguente iniezione:
if(1=1,0,~0*2)
Se la query restituisce true non accade nulla, quando è FALSE viene rivelato un messaggio generico.
La versione del server MySQL è 5.7.19, l'utente è in esecuzione come root ma, come ho visto negli ultimi aggiornamenti, il server deve essere avviato con un argomento speciale per utilizzare le istruzioni load_file o INTO OUTFILE.
Sono riuscito a selezionare "bypass" la funzione strtoupper()
fornendo caratteri di input in cirillico, ma MySQL non riconosce il nome della tabella perché è in cirillico.
Qualche consiglio su come aggirare questo?