Questo articolo spiega come testare se un sito web è sicuro da SQL injection usando lo strumento di penetration testing SQLMAP.
Che cos’è SQL Injection?
SQL Injection è una tecnica di code injection in cui un attaccante esegue query SQL malevole che controllano il database di un’applicazione web. Con il giusto set di query, un utente può ottenere l’accesso alle informazioni memorizzate nei database. SQLMAP verifica se un parametro ‘GET’ è vulnerabile a SQL Injection.
Per esempio, si consideri il seguente segmento di codice php:
$variable = $_POST;mysql_query("INSERT INTO `table` (`column`) VALUES ('$variable')");
Se l’utente inserisce “value’); DROP TABLE table;-” come input, la query diventa
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
che è indesiderabile per noi, poiché qui l’input dell’utente è direttamente compilato insieme alla query sql pre scritta. Quindi l’utente sarà in grado di inserire una query sql necessaria per manipolare il database.
Dove si può usare SQLMAP?
Se si osserva un url web che è della forma http://testphp.vulnweb.com/listproducts.php?cat=1, dove il parametro ‘GET’ è in grassetto, allora il sito web può essere vulnerabile a questa modalità di SQL injection, e un attaccante può essere in grado di accedere alle informazioni nel database. Inoltre, SQLMAP funziona quando è basato su php.
Un semplice test per verificare se il tuo sito web è vulnerabile sarebbe quello di sostituire il valore nel parametro get request con un asterisco (*). Per esempio,
http://testphp.vulnweb.com/listproducts.php?cat=*
Se questo risulta in un errore come quello riportato sopra, allora possiamo definitivamente dire che il sito web è vulnerabile.
Installazione di sqlmap
SQLMAP viene pre – installato con kali linux, che è la scelta preferita della maggior parte dei penetration tester. Tuttavia, è possibile installare sqlmap su altri sistemi linux basati su debian utilizzando il comando
sudo apt-get install sqlmap
Usage
In questo articolo, faremo uso di un sito web che è progettato con vulnerabilità a scopo dimostrativo:
http://testphp.vulnweb.com/listproducts.php?cat=1
Come potete vedere, c’è un parametro di richiesta GET (cat = 1) che può essere cambiato dall’utente modificando il valore di cat. Quindi questo sito potrebbe essere vulnerabile a SQL injection di questo tipo.
Per testare questo, usiamo SQLMAP. Per vedere l’insieme dei parametri che possono essere passati, digitate nel terminale,
sqlmap -h
I parametri che useremo per l’SQL Injection di base sono mostrati nell’immagine sopra. Insieme a questi, useremo anche i parametri -dbs e -u, il cui uso è stato spiegato nel Passo 1.
Utilizzare SQLMAP per testare un sito web per la vulnerabilità di SQL Injection:
- Passo 1: Elencare le informazioni sui database esistenti
Per prima cosa, dobbiamo inserire l’url web che vogliamo controllare insieme al parametro -u. Possiamo anche usare il parametro -tor se vogliamo testare il sito web usando dei proxy. Ora, tipicamente, vorremmo testare se è possibile ottenere l’accesso a un database. Quindi usiamo l’opzione -dbs per farlo. -dbs elenca tutti i database disponibili.sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 --dbs
Abbiamo il seguente output che ci mostra che ci sono due database disponibili. A volte, l’applicazione vi dirà che ha identificato il database e vi chiederà se volete testare altri tipi di database. Potete andare avanti e digitare ‘Y’. Inoltre, potrebbe chiederti se vuoi testare altri parametri per le vulnerabilità, digita ‘Y’ qui perché vogliamo testare a fondo l’applicazione web.
Osserviamo che ci sono due database, acuart e information_schema
- Passo 2: elencare le informazioni sulle tabelle presenti in un particolare database
Per provare ad accedere a uno qualsiasi dei database, dobbiamo modificare leggermente il nostro comando. Ora usiamo -D per specificare il nome del database a cui vogliamo accedere, e una volta che abbiamo accesso al database, vogliamo vedere se possiamo accedere alle tabelle. Per questo, usiamo la query -tables. Accediamo al database acuart.sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 -D acuart --tables
Tables
Nell’immagine qui sopra, vediamo che sono state recuperate 8 tabelle. Quindi ora sappiamo sicuramente che il sito web è vulnerabile.
- Passo 3: elencare le informazioni sulle colonne di una particolare tabella
Se vogliamo visualizzare le colonne di una particolare tabella, possiamo usare il seguente comando, in cui usiamo -T per specificare il nome della tabella, e -colonne per interrogare i nomi delle colonne. Cercheremo di accedere alla tabella “artisti”.
sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 -D acuart -T artists --columns
Colonne
- Passo 4: Scaricare i dati dalle colonne
Similmente, possiamo accedere alle informazioni in una colonna specifica utilizzando il seguente comando, dove -C può essere usato per specificare più nomi di colonne separati da una virgola, e la query -dump recupera i datisqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1-D acuart -T artists -C aname --dump
Dall’immagine sopra, possiamo vedere che abbiamo avuto accesso ai dati dal database. Allo stesso modo, in tali siti web vulnerabili, possiamo letteralmente esplorare i database per estrarre informazioni
Prevenire l’SQL Injection
L’iniezione SQL può essere generalmente prevenuta usando Prepared Statements . Quando usiamo una dichiarazione preparata, stiamo fondamentalmente usando un modello per il codice e analizzando il codice e l’input dell’utente separatamente. Non mischia la query inserita dall’utente e il codice. Nell’esempio dato all’inizio di questo articolo, l’input inserito dall’utente è direttamente inserito nel codice e sono compilati insieme, e quindi siamo in grado di eseguire il codice dannoso. Per le istruzioni preparate, fondamentalmente inviamo la query sql con un segnaposto per l’input dell’utente e poi inviamo l’effettivo input dell’utente come un comando separato.
Considerate il seguente segmento di codice php.
$db = new PDO('connection details');$stmt = db->prepare("Select name from users where id = :id");$stmt->execute(array(':id', $data));
In questo codice, l’input dell’utente non è combinato con l’istruzione preparata. Sono compilati separatamente. Quindi, anche se il codice dannoso viene inserito come input dell’utente, il programma tratterà semplicemente la parte dannosa del codice come una stringa e non un comando.
Nota: Questa applicazione deve essere usata solo per scopi di test
Articolo correlato
Iniezione SQL di base e mitigazione
Riferimento:stackoverflow.com
Questo articolo è stato contribuito da Deepak Srivatsav. Se ti piace GeeksforGeeks e vuoi contribuire, puoi anche scrivere un articolo usando contribute.geeksforgeeks.org o inviare il tuo articolo a [email protected]. Vedi il tuo articolo apparire sulla pagina principale di GeeksforGeeks e aiuta altri Geeks.