01 // PSYCHOLOGIE DU SQLI
L'injection SQL n'est pas un bug technique, c'est une faille logique. Elle survient quand un programme confond du "texte" envoyé par un utilisateur avec des "instructions" destinées à la base de données.
Le concept de Concaténation
Dans ce lab, le serveur construit sa requête comme ceci :
Si vous injectez ' OR 1=1--, vous changez la structure même du programme.
02 // ARCHITECTURE_CIBLE
Avant d'attaquer, un hacker doit cartographier la structure de la base de données. C'est la phase de Reconnaissance.
Étape 1 : Nombre de colonnes (ORDER BY)
L'attaque UNION nécessite d'avoir le même nombre de colonnes que la requête originale. Testez l'index jusqu'à l'erreur :
' ORDER BY 5-- => ERREUR
Étape 2 : Découverte du Schéma
Dans SQLite, la table sqlite_master contient le plan de toute la base. On injecte pour voir la structure de la table users :
Cela vous révèlera qu'il existe une colonne nommée password.
03 // PROTOCOLE_UNION
L'attaque par UNION permet d'exfiltrer les données directement dans l'interface de la victime.
Le Payload d'Extraction
Puisque nous avons identifié 4 colonnes, nous construisons notre UNION ainsi :
Mapping des résultats (Le Piège)
Le serveur affichera les données dans ses propres cases :
- Username (Jaune) : Affichera
username - Email (Gris) : Affichera
password(C'est votre but !) - Bio (Petit texte) : Affichera
email
[DB_DUMP] dans le nom, c'est que le simulateur a validé votre exfiltration massive.
04 // INJECTION_AVEUGLE
Parfois, le serveur ne renvoie rien à l'écran (pas d'erreurs, pas de données). On parle de Blind SQLi.
Méthode Boolean (Vrai/Faux)
On pose une question. Si la page charge l'utilisateur, la réponse est OUI. Sinon, c'est NON.
Méthode Temporelle (Time-based)
On demande à la DB de "dormir" si notre supposition est correcte. On mesure le temps de réponse.
05 // REMÉDIATION_TACTIQUE
La SQL Injection est considérée comme une faute de développement élémentaire en 2026. La solution est universelle.
Les Requêtes Préparées (Prepared Statements)
On envoie d'abord la structure de la commande, puis les données séparément. Le moteur SQL ne peut plus confondre les deux.
$stmt = $pdo->prepare("SELECT * FROM users WHERE name = ?");
$stmt->execute([$_GET['search']]);
Pourquoi ça marche ?
Le moteur SQL compile la commande avant de recevoir votre texte. Votre payload ' OR 1=1 est alors traité comme un simple nom d'utilisateur bizarre, et non comme du code.