FlawOpen

flawopen.com/Injection SQL

Injection SQL

Critique CWE-89
Langue : English Português (Brasil) Español Français Deutsch Русский 简体中文 日本語 हिन्दी 한국어 Bahasa Indonesia

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

Étape 1

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.

Étape 2

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.

Étape 3

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.

Étape 4

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

Python JavaScript Go Java PHP C# Ruby C/C++ Rust Kotlin Swift

Liste de Contrôle de Sécurité pour l'Ingénierie

Sources

À lire aussi

Les requêtes paramétrées expliquées Un ORM suffit-il ? Les procédures stockées empêchent-elles l'injection SQL ? Injection SQL dans MOVEit Transfer (2023) Injection dans psql de PostgreSQL (2024)