cybercursus

Ta première injection SQL

10 min · Débutant · 7 août 2026

Sommaire
  1. Une page de connexion vulnérable
  2. Refermer la chaîne plus tôt que prévu
  3. Le rôle des commentaires SQL

Une page de connexion vulnérable

Prenons un formulaire de connexion classique. Le serveur reçoit un identifiant et un mot de passe, puis construit la requête suivante :

sql
SELECT * FROM utilisateurs
WHERE identifiant = 'ALICE' AND mot_de_passe = 'motdepasse123'

Si un utilisateur correspondant existe, l’application considère la connexion réussie. Tant que les deux valeurs viennent directement d’un formulaire sans validation, elles peuvent contenir n’importe quel caractère, y compris une apostrophe, qui referme prématurément la chaîne de texte SQL.

Astuce

Avant de tenter une charge d’injection, teste toujours une valeur de contrôle anodine (un mot de passe quelconque). Elle sert de point de comparaison : sans savoir à quoi ressemble un échec normal, impossible de repérer avec certitude qu’une charge a changé le comportement de l’application.

Refermer la chaîne plus tôt que prévu

Imaginons que le champ mot de passe contienne la valeur suivante :

text
' OR '1'='1

Une fois insérée dans le gabarit de requête, elle produit :

sql
SELECT * FROM utilisateurs
WHERE identifiant = 'ALICE' AND mot_de_passe = '' OR '1'='1'

La condition '1'='1' est toujours vraie, quel que soit l’identifiant. La clause WHERE devient donc systématiquement vraie, et la requête retourne un utilisateur, sans que le bon mot de passe ait été fourni.

Essaie-le toi-même : saisis ' OR '1'='1 dans le champ ci-dessous et observe la requête se construire, puis exécute-la sur une vraie base en mémoire.

sql
SELECT * FROM utilisateurs WHERE identifiant = 'ALICE' AND mot_de_passe = '{valeur}'

Danger

Cette charge fonctionne uniquement parce que la requête est reconstruite à chaque appel par concaténation. Une requête paramétrée, où la valeur est transmise séparément du texte SQL, neutralise complètement cette technique.

Le rôle des commentaires SQL

Une variante fréquente ajoute un commentaire SQL (-- ou #) pour neutraliser le reste de la requête d’origine, notamment quand une seconde condition suit la vérification du mot de passe :

text
ALICE'--

Tout ce qui suit -- sur la ligne est ignoré par le moteur SQL. Le mot de passe attendu n’est alors même plus évalué. Le choix entre -- et # dépend du moteur : -- est le plus répandu (attention, certains moteurs exigent un espace après), # est spécifique à MySQL.

Que produit la valeur ' OR '1'='1 insérée dans un mot de passe concaténé ?
À quoi sert un commentaire SQL (--) dans une charge d'injection ?
Pourquoi tester d'abord une valeur de contrôle (un mot de passe quelconque, non malveillant) avant d'essayer une charge d'injection ?

Pour aller plus loin

Commentaires

Recherche