Chapitre 8 (suite) — Injection SQL

⏱ ~30 min autonome · ~45 min encadré

L'injection SQL reste, des décennies après sa découverte, l'une des vulnérabilités web les plus fréquentes et les plus dommageables — non pas parce qu'elle est difficile à corriger, mais parce que la correction exige une discipline systématique plutôt qu'un correctif ponctuel.

Une application web mal conçue construit parfois ses requêtes vers la base de données en insérant directement une entrée utilisateur dans une chaîne de caractères SQL, sans distinction entre « donnée » et « commande ». Si cette entrée contient elle-même des instructions SQL valides, la base de données les exécute comme si elles faisaient partie de la requête légitime — l'attaquant a effectivement injecté sa propre logique dans celle de l'application.

Mémorisez ! L'injection SQL n'est pas une faille de la base de données elle-même — c'est un défaut de l'application qui ne sépare pas correctement les données de la commande avant de les transmettre à la base de données.

TypePrincipe
En bande (in-band)Le résultat de l'injection est directement visible dans la réponse de l'application — le canal d'attaque et le canal de résultat sont les mêmes. La forme la plus simple à exploiter et à détecter.
Aveugle (blind)Aucun résultat n'est directement affiché, mais l'attaquant déduit de l'information à partir du comportement de l'application — une réponse différente selon qu'une condition est vraie ou fausse, ou un délai de réponse volontairement provoqué.
Hors bande (out-of-band)Le résultat est exfiltré via un canal totalement différent de celui de la requête (une requête DNS ou HTTP déclenchée vers un serveur contrôlé par l'attaquant) — utilisée quand ni l'injection en bande ni l'aveugle ne sont praticables.
Scénario : Une page de connexion ne révèle jamais directement de données, mais répond plus lentement lorsqu'une condition SQL injectée est vraie que lorsqu'elle est fausse. En mesurant précisément ce délai de réponse pour différentes conditions testées une à une, un attaquant peut reconstituer un contenu entier de base de données sans jamais voir une seule donnée affichée directement — c'est le principe de l'injection aveugle basée sur le délai (time-based blind).

Requêtes préparées

La contre-mesure structurelle de référence : les requêtes préparées (prepared statements) séparent explicitement la structure de la requête SQL (fixée à l'avance) des données fournies par l'utilisateur (toujours traitées comme de simples valeurs, jamais comme du code exécutable) — peu importe ce que contient l'entrée utilisateur, elle ne peut jamais altérer la structure de la commande elle-même.

Validation des entrées

En complément (jamais en remplacement) des requêtes préparées, valider le format attendu d'une entrée (un code postal ne devrait contenir que des chiffres et lettres selon un format précis, par exemple) réduit encore la surface d'attaque, en particulier pour les contextes où une requête préparée classique ne s'applique pas directement (noms de colonnes ou de tables dynamiques, par exemple).

Sur le terrain

PortSwigger Web Security Academy propose des laboratoires interactifs gratuits en ligne couvrant l'injection SQL sous toutes ses formes (en bande, aveugle, hors bande), alignés sur l'OWASP Top 10. C'est la ressource pratique recommandée pour qui veut s'exercer concrètement au-delà de la théorie couverte ici — ce cours n'inclut volontairement pas de laboratoire pratique en version publique (voir Pour les établissements pour la version avec laboratoires sur mesure).

Suite du chapitre → XSS & Autres Attaques Web

1. Quelle est la cause fondamentale d'une vulnérabilité d'injection SQL ?

L'injection SQL provient d'un défaut applicatif : l'entrée utilisateur est traitée comme faisant partie de la commande.

2. Dans une injection aveugle basée sur le délai (time-based blind), comment l'attaquant obtient-il de l'information ?

L'injection aveugle basée sur le délai déduit l'information à partir du temps de réponse observé, sans affichage direct.

3. Qu'est-ce qui caractérise une injection hors bande (out-of-band) ?

L'injection hors bande utilise un canal séparé pour exfiltrer le résultat, utile quand les autres méthodes échouent.

4. Comment une requête préparée protège-t-elle contre l'injection SQL ?

Les requêtes préparées garantissent que l'entrée utilisateur ne peut jamais altérer la structure de la commande SQL.

5. Pourquoi la validation des entrées ne remplace-t-elle pas les requêtes préparées ?

Les deux mesures se complètent ; la validation seule n'offre pas la garantie structurelle des requêtes préparées.

6. Quelle ressource gratuite ce cours recommande-t-il pour s'exercer concrètement à l'injection SQL ?

PortSwigger Web Security Academy propose des laboratoires gratuits en ligne sur l'injection SQL et d'autres vulnérabilités web.

7. Quelle forme d'injection est la plus simple à détecter et exploiter ?

L'injection en bande affiche directement le résultat, la rendant la plus simple à repérer et exploiter.

8. Pourquoi ce cours n'inclut-il pas de laboratoire pratique d'injection SQL dans sa version publique ?

Le choix de ne pas inclure de labo en v1 est explicite et documenté, les labos étant positionnés comme offre sur mesure.

9. Une page qui ne montre aucun résultat mais répond différemment selon la véracité d'une condition injectée illustre :

L'absence de résultat direct mais une différence de comportement observable définit l'injection aveugle.

10. Pourquoi l'injection SQL reste-t-elle fréquente des décennies après sa découverte ?

Bien que la contre-mesure (requêtes préparées) soit bien connue, son application systématique et cohérente reste un défi organisationnel.