Approcci non lavorativi (multi-query, inserimento / eliminazione / aggiornamento)
mysql_query
non supporta la multi-query:
multiple queries are not supported
Ciò significa che l'aggiunta di un'altra query tramite ;
per eliminare, modificare o inserire dati non funzionerà. Sei bloccato con la query di selezione che hai.
Possiamo anche vedere che i dati selezionati non sono visualizzati, quindi hai effettivamente un'iniezione cieca.
Approccio improbabile: scrivere un file di shell
In teoria, potresti provare a scrivere dati su un file, ad esempio per ottenere una shell PHP. Potrebbe assomigliare a questo:
' UNION SELECT '<?php passthru($_GET['x']);' INTO OUTFILE '/var/www/404.php' -- -
È tuttavia improbabile che tu disponga di autorizzazioni sufficienti per questo. Non avresti solo bisogno di un utente SQL che abbia il permesso di scrivere su un file e su una directory a cui l'utente mysql può effettivamente scrivere, ma il server mysql dovrebbe anche essere eseguito senza l'opzione --secure-file-priv
, che non è il caso per impostazione predefinita nei sistemi moderni.
Leggi dati ciechi: basato su errori
Quanto sopra significa che l'unico vettore di attacco sta leggendo i dati dal database. Se sei fortunato, gli errori ti verranno mostrati.
Se vengono visualizzati degli errori, dovrai semplicemente creare un errore che contenga le informazioni che vuoi leggere. Un modo è utilizzare extractvalue
:
' or extractvalue(1,version()) -- -
Invece di chiedere semplicemente la versione, puoi selezionare i nomi di tabella e colonna da INFORMATION_SCHEMA
. Una volta trovate le tabelle interessanti, leggi i dati.
Leggi dati ciechi: basato sul contenuto
Forse eri sfortunato e gli errori non sono mostrati. Puoi ancora estrarre i dati chiedendo sì / no domande:
' AND substring(version(),1,1)='5
Come puoi vedere, l'intera query compresa l'iniezione restituirà true se la versione di MySQL è 5 e false altrimenti. Quindi, a seconda di cosa succede - lo script muore o non lo è - conosci la versione di MySQL.
Invece di chiedere la versione, puoi chiedere altri dati, ad esempio il primo carattere dell'hash della password del primo utente nella tabella utenti mysql.
Puoi ottimizzare l'approccio usando ASCII e chiedendo se il valore è più grande o più piccolo di un certo numero, e quindi restringi la finestra del possibile carattere.
Probabilmente vorrai utilizzare uno strumento o uno script personalizzato per lo sfruttamento effettivo, dato che avrai bisogno di molte richieste.
Leggi dati ciechi: basati sul tempo
Solo per completezza: se non ricevi alcun feedback (nessun messaggio vietato), puoi ancora sfruttare le iniezioni in selezione in base al tempo necessario per completare una richiesta.
L'idea è la stessa dello sfruttamento basato sul contenuto, ma invece di ottenere una risposta diversa, eseguirai un'attività lenta o meno:
' AND IF(SUBSTRING(version(), 1, 1)='5',BENCHMARK(50000000,ENCODE('MSG','by 5 seconds')),null) %23