Blog

Les développeurs conquièrent la sécurité : Partagez et apprenez - Injection SQL

December 6, 2018
Jaap Karan Singh

En termes simples, le SQL (ou Structured Query Language) est le langage utilisé pour communiquer avec les bases de données relationnelles ; c'est le langage de requête utilisé par les développeurs, les administrateurs de bases de données et les applications pour gérer les quantités massives de données générées chaque jour.

Nos données deviennent rapidement l'une des ressources les plus précieuses au monde... et lorsqu'une chose a de la valeur, les personnes malveillantes cherchent à s'en emparer pour leur propre profit.

Les attaquants utilisent l'injection SQL -- l'une des vulnérabilités de données les plus anciennes (depuis 1998 !) et les plus tenaces -- pour voler et modifier les informations sensibles contenues dans des millions de bases de données à travers le monde. C'est une menace insidieuse, et les développeurs doivent comprendre l'injection SQL (ainsi que la manière de s'en défendre) si nous voulons assurer la sécurité de nos données.

À cette fin, nous aborderons trois aspects clés de l'injection SQL :

  • Son fonctionnement
  • Pourquoi elle est si dangereuse
  • Comment s'en défendre

Comprendre l'injection SQL

L'injection SQL peut se résumer en un mot : le contexte.

Au sein d'une application, deux contextes coexistent : celui des données et celui du code. Le contexte du code indique à l'ordinateur ce qu'il doit exécuter et le sépare des données à traiter.

L'injection SQL se produit lorsqu'un attaquant saisit des données qui sont interprétées par erreur comme du code par l'interpréteur SQL.

Un exemple courant est un champ de saisie sur un site web, où un attaquant saisit « ' OR 1=1 » qui est ajouté à la fin d'une requête SQL. Lorsque cette requête est exécutée, elle renvoie « vrai » pour chaque ligne de la base de données. Cela signifie que tous les enregistrements de la table interrogée seront renvoyés.

Les conséquences d'une injection SQL peuvent être catastrophiques. Si cela se produit sur une page de connexion, cela pourrait renvoyer tous les enregistrements des utilisateurs, incluant potentiellement les noms d'utilisateur et les mots de passe. Si une simple requête d'extraction de données réussit, alors les requêtes visant à modifier les données le pourront tout autant.

Examinons quelques exemples de code vulnérable afin que vous puissiez voir à quoi ressemble concrètement une vulnérabilité par injection SQL.

Jetez un œil à ce code :

String query = "SELECT account balance FROM user_data WHERE user_name = "
+ request.getParameter("customerName");
try {
   Statement statement = connection.createStatement( ... );
   ResultSet results = statement.executeQuery( query );
}

Le code ici se contente d'ajouter les informations du paramètre client à la fin de la requête SQL sans aucune validation. Lorsque cela se produit, un attaquant peut saisir du code dans un champ de saisie ou dans les paramètres d'une URL, et celui-ci sera exécuté.

L'essentiel n'est pas que les attaquants puissent seulement ajouter « ' OR 1=1 » à chaque requête SELECT, mais qu'un attaquant puisse manipuler n'importe quel type de requête SQL (INSERT, UPDATE, DELETE, DROP, etc.) et l'étendre avec tout ce que la base de données autorise. Il existe d'excellentes ressources et outils disponibles dans le domaine public qui montrent ce qui est possible.

Nous verrons bientôt comment corriger ce problème. Commençons par comprendre l'ampleur des dégâts potentiels.

Pourquoi l'injection SQL est si dangereuse

Voici trois exemples de failles causées par des injections SQL :

  • Le site web de l'Illinois Board of Election a été piraté en raison de vulnérabilités liées à l'injection SQL. Les attaquants ont dérobé les données personnelles de 200 000 citoyens américains. La nature de la vulnérabilité découverte signifiait que les attaquants auraient également pu modifier les données, bien qu'ils ne l'aient pas fait.
  • Hetzner, une société d'hébergement web sud-africaine, a subi une intrusion ayant compromis 40 000 dossiers clients. Une vulnérabilité par injection SQL a permis le vol potentiel de l'intégralité des dossiers clients de leur base de données.
  • Un prestataire de services financiers catholiques dans le Minnesota, aux États-Unis, a été victime d'une intrusion par injection SQL. Les détails de comptes, incluant les numéros de compte de près de 130 000 clients, ont été dérobés.

Les données sensibles peuvent être utilisées pour prendre le contrôle de comptes, réinitialiser des mots de passe, voler de l'argent ou commettre des fraudes.

Même les informations non considérées comme sensibles ou personnellement identifiables peuvent servir à d'autres attaques. Une adresse ou les quatre derniers chiffres de votre numéro d'identification officiel peuvent être utilisés pour usurper votre identité auprès d'entreprises ou pour réinitialiser votre mot de passe.

Lorsqu'une attaque réussit, les clients peuvent perdre confiance en l'entreprise. La remise en état des systèmes ou le paiement d'amendes réglementaires peuvent coûter des millions de dollars.

Mais il n'est pas nécessaire que cela se termine ainsi pour vous.

Neutraliser l'injection SQL

L'injection SQL peut être neutralisée en étiquetant clairement les différentes parties de votre application, afin que l'ordinateur sache distinguer les données du code à exécuter. Cela peut être réalisé grâce aux requêtes paramétrées.

Lorsque les requêtes SQL utilisent des paramètres, l'interpréteur SQL traite le paramètre uniquement comme une donnée. Il ne l'exécute pas en tant que code.

Par exemple, une attaque telle que « ' OR 1=1 » ne fonctionnera pas. La base de données recherchera la chaîne « OR 1=1 » et ne la trouvera pas. Elle se contentera de répondre : « Désolé, je ne trouve pas ce que vous cherchez. »

Voici un exemple de requête paramétrée en Java :

Code example showing use of parameterized SQL queries to securely insert user data.

La plupart des frameworks de développement intègrent des défenses contre l'injection SQL.

Les ORM (Object Relational Mappers), tels que Entity Framework dans la famille .NET, paramètrent les requêtes par défaut. Cela permet de gérer l'injection SQL sans aucun effort de votre part.

Cependant, vous devez comprendre le fonctionnement de votre ORM spécifique. Par exemple, Hibernate, un ORM populaire dans l'univers Java, peut rester vulnérable à l'injection SQL s'il est mal utilisé.

Le paramétrage des requêtes est la première et la meilleure des défenses, mais il en existe d'autres. Les procédures stockées prennent également en charge les paramètres SQL et peuvent être utilisées pour prévenir l'injection SQL. Gardez à l'esprit que les procédures stockées doivent également être conçues correctement pour que cela fonctionne.

// Cela devrait VRAIMENT être validé aussi
String custname = request.getParameter("customerName");
// effectuer une validation des entrées pour détecter les attaques
String query = "SELECT account_balance FROM user_data WHERE user_name = ? ";

PreparedStatement pstmt = connection.preparedStatement( query );
pstmt.setString(1, custname);
ResultSet results = pstmt.executeQuery( );

Validez et nettoyez toujours vos entrées. Étant donné que certains caractères, comme « OR 1=1 », ne seront jamais saisis par un utilisateur légitime de votre application, il n'y a aucune raison de les autoriser. Vous pouvez afficher un message d'erreur à l'utilisateur ou les supprimer de votre saisie avant tout traitement.

Cela dit, ne comptez pas uniquement sur la validation et le nettoyage pour vous protéger. Des individus malintentionnés ont trouvé des moyens de les contourner. Ce sont de bonnes stratégies de défense en profondeur (DiD), mais le paramétrage reste la méthode infaillible pour couvrir tous les risques.

Une autre bonne stratégie de défense en profondeur consiste à appliquer le principe du « moindre privilège » au sein de la base de données et à utiliser des listes blanches pour les entrées. Appliquer ce principe signifie que votre application ne dispose pas de droits illimités sur la base de données. Si un attaquant parvenait à y accéder, les dégâts qu'il pourrait causer seraient limités.

L'OWASP propose une excellente fiche mémo sur les injections SQL expliquant comment gérer cette vulnérabilité dans divers langages et plateformes... mais pour aller plus loin, vous pouvez dès maintenant relever un défi d'injection SQL dans votre langage préféré sur notre plateforme ; voici quelques-uns des plus populaires pour commencer :

Injection SQL en C#

Injection SQL en Node.js

Injection SQL en Python Django

Injection SQL en Java Spring

Le début du parcours

Vous avez fait de grands progrès dans la compréhension des injections SQL et des mesures nécessaires pour les corriger. Bravo !

Nous avons vu comment se produisent les injections SQL : généralement, un attaquant utilise les entrées utilisateur pour manipuler vos requêtes de base de données à des fins malveillantes.

Nous avons également constaté les dégâts causés par l'exploitation de ces vulnérabilités : des comptes compromis et des millions de dollars perdus... un véritable cauchemar, et qui coûte cher.

Nous avons vu comment prévenir les injections SQL :

  • Paramétrage des requêtes
  • Utilisation d'ORM et de procédures stockées
  • Validation et mise en liste blanche des entrées utilisateur

Maintenant, c'est à vous de jouer. La pratique est le meilleur moyen d'apprendre et de maîtriser le sujet. Pourquoi ne pas consulter nos ressources pédagogiques sur les injections SQL, puis essayer notre démo gratuite de la plateforme ? Vous serez alors en bonne voie pour devenir un Secure Code Warrior.

Slogan

Gouvernez le développement assisté par IA avant la mise en production

Évaluez les risques liés à l'IA, appliquez des politiques de codage sécurisé dès le commit et accélérez la livraison sécurisée tout au long de votre cycle de développement.

Réserver une démo
Bibliothèque de ressources

Explorer plus d'articles

Accédez à du contenu expert sur le codage sécurisé, la gouvernance de l'IA et la gestion des risques logiciels.

tout parcourir
Étude de cas
Libellé du filtre
Ceci est un texte à l'intérieur d'un bloc div.

Supercharged Security Awareness: How Tournaments are Inspiring Developers at Erste Group

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

En savoir plus
Étude de cas
Libellé du filtre
Ceci est un texte à l'intérieur d'un bloc div.

Security as culture: How Blue Prism cultivates world-class secure developers

Learn how Blue Prism, the global leader in intelligent automation for the enterprise, used Secure Code Warrior's agile learning platform to create a security-first culture with their developers, achieve their business goals, and ship secure code at speed

En savoir plus
Étude de cas
Libellé du filtre
Ceci est un texte à l'intérieur d'un bloc div.

Une culture de la sécurité : comment Sage a bâti son programme de champions

Découvrez comment Sage a renforcé sa sécurité grâce à une approche flexible axée sur les relations humaines, formant plus de 200 champions de la sécurité et obtenant une réduction mesurable des risques.

En savoir plus
Blog
Libellé du filtre
Ceci est un texte à l'intérieur d'un bloc div.

Mois de la sensibilisation à la cybersécurité 2026 : comprendre la sécurité de l'IA est essentiel à la défense de l'entreprise

Nous avons atteint un point où la plupart des grandes entreprises d'IA ont publiquement appelé à un ralentissement mondial du développement de l'IA afin de permettre aux garde-fous de sécurité de rattraper leur retard. Pourtant, la réalité est que de graves problèmes de sécurité se sont déjà concrétisés. Cela place d'innombrables responsables de la sécurité et équipes de direction dans une situation d'urgence, alors que les coûts financiers et les risques liés à la mise en œuvre de l'IA ne cessent de s'accumuler.

En savoir plus
Blog
Libellé du filtre
Ceci est un texte à l'intérieur d'un bloc div.

Levier 8 : Valoriser votre programme

Un programme de codage sécurisé a besoin de plus qu'un contenu de qualité pour réussir. Le levier 8 montre comment l'image de marque transforme la participation en une expérience convoitée, axée sur le statut.

En savoir plus
Blog
Libellé du filtre
Ceci est un texte à l'intérieur d'un bloc div.

Chaque employé est désormais en première ligne de la cybersécurité IA

Le paysage technologique des entreprises évolue à une vitesse que peu avaient anticipée avant qu'il ne soit trop tard. Nous avons officiellement franchi le cap du code écrit par l'humain et de l'assistance basique par copilote pour entrer dans l'ère du cycle de vie de développement agentique (ADLC). Si les agents IA autonomes promettent une efficacité sans précédent dans de multiples fonctions, ils apportent également une toute nouvelle catégorie de risques en matière de sécurité et de réglementation.

En savoir plus

Sécurisez le développement piloté par l'IA avant le déploiement

Identifiez les risques de développement, appliquez vos politiques et prévenez les vulnérabilités tout au long du cycle de vie de vos logiciels.

Réserver une démo
trust score
Aucun élément trouvé.