L'injection aveugle (boolean-based)
12 min · Intermédiaire · 7 août 2026
Quand la réponse ne s’affiche plus
Le chapitre précédent supposait que le résultat de la requête était directement affiché à l’écran. Beaucoup d’applications ne font pas ça : une page produit peut simplement afficher « Produit trouvé » ou « Produit introuvable », sans jamais révéler la moindre colonne de la base.
Cette différence de comportement, même minime, reste une fuite d’information exploitable. Si l’application se comporte différemment selon qu’une condition est vraie ou fausse, alors elle répond, indirectement, à n’importe quelle question qui peut se formuler en vrai ou faux.
SELECT * FROM produits WHERE id = 1 AND 1=1 -- vrai : le produit s'affiche
SELECT * FROM produits WHERE id = 1 AND 1=2 -- faux : rien ne s'affiche Poser une question sur une donnée invisible
La même logique s’applique à une donnée qu’on ne peut pas voir directement, comme un mot de passe stocké dans une autre table. Il suffit de remplacer une condition arbitraire (1=1) par une condition qui porte sur cette donnée :
SELECT * FROM produits WHERE id = 1
AND (SELECT mot_de_passe FROM utilisateurs WHERE identifiant = 'ADMIN') = 'un-essai-au-hasard' Si le produit s’affiche, la valeur essayée est correcte. Deviner un mot de passe entier au hasard n’a aucune chance d’aboutir, mais rien n’oblige à comparer la valeur complète d’un coup.
Extraire un caractère à la fois
SUBSTR(valeur, position, longueur) isole une portion précise d’une chaîne. En la combinant à la condition précédente, chaque requête ne teste plus qu’un seul caractère à une position donnée :
SELECT * FROM produits WHERE id = 1
AND SUBSTR((SELECT mot_de_passe FROM utilisateurs WHERE identifiant = 'ADMIN'), 1, 1) = 's' En répétant cette requête pour chaque lettre de l’alphabet à la position 1, puis à la position 2, et ainsi de suite, la valeur complète se reconstitue lettre par lettre, sans jamais la voir directement.
Essaie-le toi-même : la base boutique-vulnerable contient un compte ADMIN. Devine le premier caractère de son mot de passe.
SELECT * FROM produits WHERE id = 1 AND SUBSTR((SELECT mot_de_passe FROM utilisateurs WHERE identifiant = 'ADMIN'), 1, 1) = '{valeur}' Info
Deviner chaque caractère manuellement, lettre par lettre, est lent. Dans la pratique, cette technique est automatisée par des outils (comme sqlmap), et optimisée par recherche dichotomique : comparer la valeur ASCII du caractère avec > ou < réduit l’espace de recherche bien plus vite qu’une comparaison d’égalité.