Tutorial di tecniche di iniezione SQL cieche

Tutorial di tecniche di iniezione SQL cieche

Cos'è l'iniezione SQL?

L'iniezione SQL è un tipo di attacco di database in cui un aggressore cerca di rubare informazioni dal database di un'applicazione Web. Ciò può anche comportare l'esecuzione del codice remoto a seconda dell'ambiente dell'applicazione Web e della versione del database.

L'iniezione di SQL avviene a causa della scarsa igiene dell'input dell'utente. Se prendi input dall'utente in un linguaggio di codifica (PHP, ASP.Netto) e passarlo direttamente al database del server senza applicare alcun filtro sull'input, questo può derivare alla vulnerabilità di iniezione SQL.

Ad esempio, il seguente codice PHP è vulnerabile all'attacco di iniezione SQL perché passa direttamente l'input dell'utente al database. L'attaccante può elaborare la propria query di database dannosa per estrarre dati dal database.

// L'UserInput è memorizzato nella variabile ID
$ id = $ _get ['id'];
// UserInput viene eseguito direttamente nel database
$ getid = "Seleziona First_name, last_name dagli utenti dove user_id = '$ id'";
// In caso di errore o successo, i risultati vengono restituiti all'utente
$ result = mysql_query ($ getid) o die ('
' . mysql_error () . '
');
$ num = mysql_numrows ($ risultato);

D'altra parte, viene fornito un esempio di codice sicuro di tale codice da interagire con il database. Prende input dell'utente e filtra da eventuali caratteri dannosi, quindi lo passa al database.

$ id = $ _get ['id'];
$ id = strisce ($ id);
$ id = mysql_real_escape_string ($ id);

Iniezione SQL normale vs cieca

Iniezione SQL normale

Nella normale iniezione di SQL, se un utente malintenzionato cerca di inserire un singolo preventivo (') come input, quando questo singolo preventivo viene eseguito nel database, il database risponde con un errore. L'errore è stampato sul browser dell'attaccante.

Il codice responsabile di questo errore è

// Se il database risponde con un errore, viene eseguita la funzione "o die ()"
Per stampare l'errore
$ result = mysql_query ($ getid) o die ('
' . mysql_error () . '
');

Nella normale iniezione di SQL, l'attaccante può vedere i risultati dell'errore ed è facile da identificare e sfruttare.

Iniezione cieca SQL

Nel caso dell'iniezione di SQL cieca, quando viene eseguita una query dannosa come una singola citazione, l'errore del database non viene visualizzato sul browser dell'attaccante o viene visualizzato in modo molto generico che non può essere identificato e sfruttato facilmente dall'attaccante.

Di seguito è riportato il codice backend responsabile di ciò

$ result = mysql_query ($ getid); // rimosso 'o muori' per sopprimere gli errori mysql

In iniezione di SQL cieca, l'attaccante non può vedere i risultati completi, quindi questo tipo di SQLI è difficile da identificare e sfruttare ma ha lo stesso livello di rischio del normale SQLI.

Tecniche per rilevare l'iniezione cieca SQL

Mentre la normale iniezione di SQL può essere rilevata inviando un singolo preventivo (') come input ed esaminando l'errore di output, l'iniezione SQL cieca non può essere rilevata usando questa tecnica perché non visualizza alcun errore SQL. Esistono molte tecniche per rilevare un'iniezione cieca SQL, alcune di esse sono riportate come seguenti

Rilevamento vero e falso

Una delle caratteristiche dei database tra cui MySQL è il comportamento diverso su dichiarazioni vere e false. Anche se il database non mostra errori, possiamo decidere l'uso di dichiarazioni True e False. Considera il seguente scenario,

La pagina seguente è vulnerabile all'iniezione SQL cieca, dandogli un'istruzione vera visualizzerà tutte le voci nel database

1 'o 1 = 1#

Dare una falsa query come input non visualizzerà alcun dato.

1 'o 1 = 2#

Anche la pagina Web non mostra errori, la differenza tra le due pagine dice che le nostre domande vengono eseguite correttamente nel database.

Rilevamento basato sul tempo

C'è una funzione in database tra cui MySQL, MS-SQL e altri per ritardi. Possiamo usare la funzione sleep () nella nostra query, se la risposta del database è lenta, ciò significa che la nostra query viene eseguita correttamente e la pagina web è vulnerabile all'iniezione cieca SQL.

1 'e sonno (15)#

C'è un'altra funzione che richiede tempo "benchmark" che può essere utilizzata per ritardare la risposta del database

1 'e benchmark (10000000, sha1 (1337))#

La riga sopra eseguirà la funzione sha1 () 10000000 volte nel database, che aggiungerà una quantità significativa di ritardo nella risposta.

Iniezione cieca SQL basata sul tempo in altri database

MS SQL: Id = 1; ritardo di waitfor '0: 0: 10'-

Oracle SQL: E [randnum] = dbms_pipe.Riceve_Message ('[Randstr]', [SleepTime])

PostgreSQL: E [randnum] = (seleziona [randnum] da pg_sleep ([sleeptime]))

Sqlite: E [Randnum] = like ('AbcDefg', Upper (Hex (RandomBlob ([SleepTime] 00000000/2)))))

Estrazione di informazioni sul database

Il primo passo dell'estrazione del database è determinare i numeri di colonna nel database. Quindi prova a trovare colonne vulnerabili per estrarre ulteriori dati.

L'iniezione SQL cieca si comporta in modo diverso con numeri di colonna diversi nella query "ordine per".

1 'Ordine di 1#

L'istruzione sopra è vera perché almeno 1 colonna esiste sempre in un database. Ora prova con un numero molto grande.

Ordine da 1 'per 10000#

La risposta del database è diversa da quella precedente. Ora prova con 2 colonne.

L'istruzione ha funzionato, ciò significa che il database ha 2 o più colonne. Ora prova con 3 colonne.

1 'Ordine per 3#

Il database non ha inviato alcuna risposta, ciò significa che il database ha solo 2 colonne. Ora proveremo a scaricare l'elenco delle tabelle nel database, useremo la seguente query per questo

1 'Union All Select 1, Group_Concat (Table_name) da Information_Schema.
Tabelle dove table_schema = database ()#

Ci sono due tabelle nel database backend "Guestbook & Users". La tabella "utenti" può contenere nomi utente e password. Per estrarre i nomi delle colonne dalla tabella, inserire la seguente query.

1 'Union All Select 1, Group_Concat (column_name) da Information_Schema.
colonne dove table_schema = database ()#

Ora abbiamo estratti i nomi delle colonne, questo include colonne utente e password. Queste colonne archiviano i nomi utente dei clienti e le loro password.

Ora proveremo a estrarre i dati utilizzando la seguente query

1 'Union All Select 1, Group_Concat (utente, password) da utenti#

Ed è così che puoi sfruttare l'iniezione cieca SQL senza fare affidamento su errori. Le password di output vengono hash per la maggior parte del tempo, che possono essere decrittografate utilizzando strumenti come John the Ripper o Hashcat.

Conclusione:

L'iniezione SQL cieca è il tipo di SQLI che non mostra errori di database o risponde con un messaggio molto generico. Ecco perché è molto difficile identificare la vulnerabilità di iniezione SQL cieca in una pagina web. Una volta rilevato, è possibile sfruttarlo facilmente per processo manuale o automatizzato utilizzando SQLMAP.