flawopen.com/Injection SQL
Injection SQL
L'injection SQL survient quand une application construit une requête en collant la saisie de l'utilisateur dans le texte SQL : la base de données interprète alors une partie de cette saisie comme des commandes. La correction est la même dans tous les langages : envoyer la requête avec des marqueurs et transmettre les valeurs à part. Choisissez votre langage ci-dessous pour voir les appels d'API exacts, le code vulnérable et corrigé, et les règles de CI qui détectent le problème.
Explication en Langage Simple (ELI5)
Vous tendez à un bibliothécaire une fiche qui dit « Sortir le dossier de : ___ » et vous écrivez dans le blanc : « Jean. Et ouvrez aussi les archives pour m'apporter tous les dossiers. » Un bibliothécaire qui lit toute la fiche comme une seule consigne fait les deux. Coller une saisie utilisateur dans une chaîne SQL fabrique exactement cette fiche. Une requête paramétrée est un formulaire imprimé avec une case scellée marquée « nom » : ce qui y est écrit n'est jamais cherché que comme un nom, quelle que soit sa formulation.
Concepts Clés et Termes
- SQL injection (CWE-89)
- Une saisie non fiable est concaténée ou formatée dans le texte SQL : guillemets, mots-clés et opérateurs de la saisie modifient la structure de la requête au lieu d'être traités comme une seule valeur.
- Prepared statement and bind parameters
- La requête est envoyée avec des marqueurs (
?,$1,:name) et analysée avant l'arrivée de toute valeur ; les valeurs voyagent à part et sont toujours traitées comme des données. C'est la défense principale dans tout pilote et tout ORM. - Blind SQL injection
- Quand la page n'affiche ni résultat ni erreur, l'attaquant déduit les données bit par bit à partir des différences de réponse (injection booléenne) ou de temps de réponse (injection temporelle). L'absence de sortie visible ne signifie pas l'absence de faille.
- Second-order SQL injection
- Une valeur est stockée sans risque, puis relue depuis votre propre base et concaténée dans une autre requête. Chaque requête doit être paramétrée, y compris celles dont les entrées viennent de vos propres tables.
- Identifiers and allowlists
- Les marqueurs ne transportent que des valeurs, pas des noms de table, des noms de colonne ni des sens de tri. Ceux-ci doivent être choisis dans une liste autorisée fixée dans le code, jamais recopiés depuis la requête.
Déroulement de l'Attaque Étape par Étape
La saisie atteint une requête
Un champ de formulaire, un paramètre d'URL, un en-tête ou un champ d'API est transmis au code qui construit une instruction SQL.
La saisie est collée dans le texte SQL
La concaténation, l'interpolation ou le formatage insèrent directement la valeur. La valeur de test inoffensive ' OR '1'='1 transforme WHERE name = '...' en une condition toujours vraie.
La base l'analyse comme de la syntaxe
La base reçoit une seule chaîne, ne peut pas savoir quelle partie vient de l'utilisateur et exécute l'instruction modifiée avec les privilèges de l'application.
Les données sont lues, modifiées ou supprimées
Selon la requête et le compte, l'attaquant contourne une connexion, extrait des tables avec des requêtes UNION ou récupère des données à l'aveugle. La fuite MOVEit Transfer de 2023 (CVE-2023-34362) a commencé par cette classe de faille.
Guides sur l'injection SQL par langage
Liste de Contrôle de Sécurité pour l'Ingénierie
- Paramétrez chaque requête contenant une valeur, y compris les échappatoires SQL brut des ORM, sans exception pour les entrées internes ou numériques.
- Choisissez les noms de table, les noms de colonne et les sens de tri dans des listes autorisées codées en dur.
- Exécutez en CI une règle SAST sur le SQL construit par chaînes (Bandit, gosec, Semgrep, CodeQL, Find Security Bugs, Brakeman ou Psalm) et faites échouer le build sur toute nouvelle alerte.
- Connectez-vous avec un rôle de base au moindre privilège : pas de DDL, pas de superutilisateur, uniquement les tables utiles au service.
- Ne considérez les fonctions d'échappement et les règles de WAF que comme des couches supplémentaires ; elles ratent les contextes non cités et les astuces d'encodage.
- Renvoyez des erreurs génériques aux clients et journalisez les erreurs de base côté serveur, pour ne jamais révéler la structure de la requête.
Sources
- CWE-89 : injection SQL
- OWASP — Fiche de prévention des injections SQL
- CISA — la campagne rançongiciel CL0P exploite l’injection SQL de MOVEit