Glossaire · Sécurité
Injection SQL
En anglais : SQL injection
Également appelé : SQLi, injections SQL, attaque par injection SQL
Définition
Vulnérabilité où une saisie utilisateur est concaténée dans une requête SQL, permettant à un attaquant d'en modifier la logique pour lire, altérer ou supprimer des données.
L’injection SQL (SQLi) se produit quand une application construit une instruction SQL en collant la saisie de l’utilisateur dans la chaîne de la requête. Si la saisie contient de la syntaxe SQL, la base de données l’exécute comme partie de la requête. Selon la requête et les permissions de la base, un attaquant peut contourner une connexion, lire les données d’autres utilisateurs, modifier des enregistrements ou, dans les pires cas, exécuter des commandes sur le serveur. Elle figure dans la catégorie A03 Injection de l’OWASP Top 10 2021.
Exemple
Code Java vulnérable :
String sql = "SELECT * FROM users WHERE email = '" + email + "'";
ResultSet rs = conn.createStatement().executeQuery(sql);
Si email vaut ' OR '1'='1, la requête devient :
SELECT * FROM users WHERE email = '' OR '1'='1'
La condition est toujours vraie : la requête renvoie donc tous les utilisateurs. La correction est une requête paramétrée, où la saisie est envoyée séparément du texte SQL et ne peut jamais en modifier la structure :
PreparedStatement ps = conn.prepareStatement("SELECT * FROM users WHERE email = ?");
ps.setString(1, email);
ResultSet rs = ps.executeQuery();
Ce que vérifie un testeur
Avec une autorisation écrite, sur un environnement de test :
- Casser la syntaxe. Soumettez une apostrophe
'dans chaque champ texte, paramètre d’URL, en-tête et valeur JSON susceptible d’atteindre une requête. Une erreur500, un message d’erreur de la base ou un nombre de résultats modifié suggère que la saisie atteint le SQL sans échappement. - Modifier la logique. Comparez
value' AND '1'='1avecvalue' AND '1'='2. Si les deux réponses diffèrent d’une manière que la valeur seule n’explique pas, la saisie est interprétée. - Regarder les entrées moins évidentes. Les colonnes de tri, les champs de filtre, les champs de recherche et les paramètres de rapports sont souvent construits dynamiquement, car les noms de colonnes ne peuvent pas être passés en paramètres liés.
- Vérifier la gestion des erreurs. Des erreurs de base de données, des noms de tables ou des stack traces dans les réponses constituent à elles seules une anomalie.
Des outils comme sqlmap automatisent une exploration plus poussée, mais ne les lancez que sur des systèmes que vous êtes explicitement autorisé à tester, car ils peuvent modifier ou supprimer des données.
Les défenses à vérifier
Des requêtes paramétrées ou un ORM correctement utilisé partout ; des listes blanches pour les identifiants dynamiques comme les colonnes de tri ; un compte de base de données au moindre privilège ; et des messages d’erreur génériques. La validation des saisies aide, mais ne remplace pas le paramétrage des requêtes.