2. Comprendre le fonctionnement des requêtes SQL dynamiques

Avant d’exploiter une injection SQL, il est indispensable de comprendre comment une application construit ses requêtes à partir des données saisies par l’utilisateur. Cette unité détaille ce mécanisme et montre précisément où se situe la faille.

 

Une requête SQL classique

Un formulaire de connexion typique vérifie un identifiant et un mot de passe via une requête de ce type, construite côté serveur à partir des champs du formulaire :

SELECT * FROM utilisateurs WHERE login = 'alice' AND mot_de_passe = 'motdepasse123';

Dans une implémentation naïve, le code de l’application insère directement les valeurs saisies par l’utilisateur à l’intérieur des apostrophes, sans aucune vérification de leur contenu.

Le code vulnérable type

$requete = "SELECT * FROM utilisateurs WHERE login = '" . $login . "' AND mot_de_passe = '" . $motdepasse . "'";

Cette ligne de code construit la requête par simple concaténation de chaînes de caractères. Tant que $login et $motdepasse contiennent du texte ordinaire, la requête reste valide. Le problème survient dès que ces variables contiennent des caractères ayant une signification particulière pour SQL.

 

Que se passe-t-il avec une apostrophe ?

Si un attaquant saisit comme login la valeur alice’, la requête générée devient :

SELECT * FROM utilisateurs WHERE login = 'alice'' AND mot_de_passe = '...';

L’apostrophe injectée ferme prématurément la chaîne de caractères attendue par SQL, ce qui transforme la suite du texte en code SQL interprété littéralement plutôt qu’en simple donnée. C’est exactement cette confusion entre code et donnée que toute la suite du cours va exploiter.

Le rôle central de l’apostrophe

L’apostrophe simple est le délimiteur standard des chaînes de caractères en SQL. C’est pour cette raison qu’elle est systématiquement le premier caractère testé par un attaquant, ou par un auditeur de sécurité, pour détecter la présence potentielle d’une injection.

 

Les moteurs de bases de données concernés

Le principe de l’injection SQL s’applique à tous les systèmes de gestion de bases de données relationnelles : MySQL, MariaDB, PostgreSQL, Microsoft SQL Server, Oracle, SQLite. Seule la syntaxe exacte des fonctions et des commentaires varie légèrement d’un moteur à l’autre, mais le mécanisme de fond reste strictement identique.

Les commentaires SQL comme outil d’attaque

De nombreuses injections utilisent un commentaire SQL pour neutraliser la fin de la requête d’origine. Sous MySQL, les séquences — (suivie d’un espace) ou # démarrent un commentaire qui annule tout le reste de la ligne, ce qui permet à l’attaquant d’ignorer proprement la partie de la requête qu’il ne contrôle pas.

Points clés :

  • Les requêtes vulnérables sont construites par concaténation directe de données utilisateur
  • L’apostrophe simple est le délimiteur de chaîne SQL et le premier caractère testé
  • Le principe s’applique à tous les moteurs de bases de données relationnelles
  • Les commentaires SQL (–, #) permettent de neutraliser la fin de la requête d’origine
SEE ALL Add a note
YOU
Add your Comment