cybercursus

L'injection aveugle (boolean-based)

12 min · Intermédiaire · 7 août 2026

Sommaire
  1. Quand la réponse ne s’affiche plus
  2. Poser une question sur une donnée invisible
  3. Extraire un caractère à la fois

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.

sql
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 :

sql
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 :

sql
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.

sql
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é.

Qu'est-ce qui distingue une injection aveugle d'une injection UNION-based ?
Pourquoi la fonction SUBSTR est-elle centrale dans une extraction aveugle caractère par caractère ?

Pour aller plus loin

Commentaires

Recherche