Ignora PHP strtoupper () per eseguire l'iniezione SQL sul database MySQL?

1

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?

    
posta Sabin Nicula 20.09.2017 - 16:59
fonte

1 risposta

1

Usa la funzione sql CHAR () per ogni carattere che deve essere minuscolo, metti l'intera richiesta in una stringa usando concat.

SET @T = CONCAT(CHAR(109),  CHAR(121),  [...]);
PREPARE A FROM @T;
EXECUTE A;
DEALLOCATE PREPARE A;

L'ho provato e funziona bene.

edit: mostra il wrapping in proc

    
risposta data 21.09.2017 - 19:45
fonte

Leggi altre domande sui tag