L'Injection SQL (SQLi) : fonctionnement, failles historiques et bonnes pratiques de protection

L’Injection SQL (SQLi) : fonctionnement, failles historiques et bonnes pratiques de protection

Cet article fait partie de la série Les types de failles informatiques : classement par sévérité et guide complet.
Niveau de sévérité dans cette série : Élevée. Classification indicative (reste l’une des failles web les plus exploitées malgré des décennies de sensibilisation) ; la gravité réelle d’une faille dépend toujours du contexte précis et, idéalement, de son score CVSS.

Une simple guillemet mal neutralisée dans un formulaire en ligne peut suffire à faire basculer l’ensemble de la sécurité d’une entreprise. L’injection SQL, couramment désignée par le sigle SQLi, demeure l’une des failles applicatives les plus dévastatrices de l’histoire du Web. Bien qu’elle soit parfaitement comprise et que des contre-mesures efficaces existent depuis plus de vingt ans, elle continue de figurer en tête des rapports d’incidents informatiques à travers le monde.

Dans le cadre de notre série dédiée aux failles informatiques, l’injection SQL est classée au niveau de sévérité Élevée. Sur l’échelle d’évaluation globale du score CVSS, une vulnérabilité SQLi franchit très régulièrement le seuil de 8.0/10 (sévérité Élevée à Critique). Ce niveau s’explique par le fait qu’un attaquant distant, souvent sans la moindre authentification, peut réussir à lire la totalité des tables d’une base de données confidentielle, en modifier ou en supprimer le contenu, et parfois effectuer une escalade de privilèges jusqu’à exécuter des commandes arbitraires sur le système d’exploitation du serveur.

Schéma de principe d'une attaque par injection SQL
Diagramme explicatif du principe d’exécution d’une injection SQL entre le navigateur, le serveur web et le SGBD. (Batka savemazaalai (CC BY-SA 4.0), via Wikimedia Commons.)

Origine

L’émergence des injections SQL est intimement liée à l’avènement du Web dynamique à la fin des années 1990. Pour afficher des contenus personnalisés, les développeurs ont commencé à interconnecter les serveurs web avec des systèmes de gestion de bases de données relationnelles (SGBDR). À cette période, la méthode la plus rapide de codage consistait à construire des requêtes SQL dynamiques en concaténant directement des chaînes de caractères brutes fournies par les utilisateurs (champs de formulaires, paramètres dans l’URL ou cookies).

La première publication formelle documentant ce vecteur d’attaque remonte à décembre 1998. Dans le volume 8 (numéro 54) du légendaire magazine hacker Phrack, le chercheur en sécurité Jeff Forristal (écrivant sous le pseudonyme RRF64) publie un article révélant comment manipuler des instructions SQL non filtrées dans Microsoft SQL Server. Ce concept s’est rapidement propagé à l’ensemble des moteurs de base de données du marché (MySQL, PostgreSQL, Oracle SQL, SQLite), dévoilant une fragilité structurelle dans la manière dont les applications séparaient le code exécutable des données.

Classification des vecteurs d'attaque SQLi
Arborescence de classification des différentes techniques et variantes d’injection SQL. (KDeltchev (CC BY-SA 3.0), via Wikimedia Commons.)

Définition

Techniquement, une injection SQL survient lorsqu’une application web intègre des données non fiables fournies par un utilisateur directement dans la structure d’une requête SQL sans assainissement ni typage strict. Lorsqu’un navigateur transmet des caractères de contrôle SQL (tels que la simple quote ', la double quote " ou le double tiret de commentaire --), l’interpréteur du serveur SGBD ne fait plus la différence entre les instructions prévues par le développeur et les données saisies.

L’attaquant exploite ce défaut de conception pour détourner la logique initiale de la commande. Par exemple, dans un formulaire de connexion bancaire demandant un nom d’utilisateur, l’injection de la chaîne ' OR '1'='1 transforme la condition d’accès en une tautologie toujours vraie, permettant au pirate de contourner totalement la phase d’authentification sans connaître le mot de passe.

En fonction des retours fournis par l’application, on distingue plusieurs catégories de SQLi :

  • In-band SQLi (ou classique) : l’attaquant extrait les données directement via l’interface web (méthodes UNION ou messages d’erreurs SQL détaillés).
  • Inferential SQLi (ou Blind SQLi) : le serveur ne renvoie aucune donnée brute, mais l’attaquant reconstruit l’information bit par bit en observant le comportement de l’application (réponses Vrai/Faux ou délais de réponse provoqués par la fonction SLEEP()).
  • Out-of-band SQLi : l’attaque pousse le serveur de base de données à effectuer des requêtes DNS ou HTTP vers un serveur sous le contrôle de l’attaquant.

C’est en raison de cette flexibilité offensive et de la prévalence historique du problème que la fondation OWASP classe l’injection SQL au premier rang de ses préoccupations depuis la création de son classement OWASP Top 10 en 2003 (aujourd’hui regroupée dans la catégorie A03:2021-Injection).

Exemples réels

Les conséquences financières et réputationnelles d’une faille SQLi mal corrigée sont illustrées par plusieurs attaques majeures :

Heartland Payment Systems (2007-2008)

Entre la fin de l’année 2007 et 2008, l’un des plus grands processeurs de paiement américains, Heartland Payment Systems, subit ce qui restera longtemps la plus vaste brèche de données de cartes bancaires. Le cybercriminel Albert Gonzalez et ses complices ont exploité une vulnérabilité d’injection SQL sur une page web d’identification pour pénétrer le réseau interne de l’entreprise. Une fois infiltrés, ils ont déployé un sniffer de paquets pour intercepter les flux monétiques. Révélé publiquement en janvier 2009, le piratage a compromis plus de 130 millions de numéros de cartes de crédit et de débit, coûtant à l’entreprise plus de 200 millions de dollars en pénalités et indemnités.

TalkTalk (Octobre 2015)

En octobre 2015, le fournisseur d’accès à Internet britannique TalkTalk est ciblé par des hackers qui exploitent une faille SQLi élémentaire sur des pages web anciennes, héritées du rachat du groupe Tiscali UK. En quelques minutes, les pirates dérobent les données personnelles de 156 959 clients (noms, adresses, adresses email, numéros de téléphone) ainsi que les coordonnées bancaires de plus de 15 000 personnes. L’autorité de contrôle britannique, l’ICO, a condamné TalkTalk à une amende record de 400 000 livres sterling pour négligence grave d’infrastructures informatiques obsolètes.

Visualisation d'un formulaire web vulnérable à l'injection SQL
Exemple d’altération de requête SQL initiée à partir d’un champ de saisie d’un formulaire. (Virkastoro (CC BY-SA 4.0), via Wikimedia Commons.)

MOVEit Transfer (Mai 2023)

Plus récemment, en mai 2023, l’application de transfert de fichiers sécurisé MOVEit Transfer a été victime d’une exploitation massive de la vulnérabilité zero-day répertoriée CVE-2023-34362, cataloguée par le NIST et le registre officiel des vulnérabilités de la CVE géré par le MITRE. Le groupe de rançongiciel Cl0p a exploité cette injection SQL non authentifiée pour voler des millions de fichiers sensibles auprès de plus de 2 700 organisations mondiales (gouvernements, banques, hôpitaux), affectant plus de 90 millions d’individus à travers la chaîne logistique logicielle.

Comment s’en protéger

La neutralisation des injections SQL ne nécessite pas de dispositifs complexes si les bonnes pratiques d’ingénierie logicielle sont appliquées dès le départ :

  • Employer des requêtes préparées (requêtes paramétrées) : C’est la protection fondamentale et suffisante. En utilisant des paramètres liés (prepared statements), le moteur SGBD compile la requête SQL indépendamment des valeurs fournies. Les données saisies par l’utilisateur ne peuvent plus jamais modifier la logique de la commande.
  • Utiliser un ORM (Object-Relational Mapping) : Les frameworks de développement modernes (tels que Hibernate, Doctrine ou Entity Framework) s’appuient par défaut sur des requêtes paramétrées pour traiter les objets en base de données.
  • Appliquer une validation stricte des entrées : Mettre en œuvre des listes blanches (whitelisting) et valider scrupuleusement le type, la longueur et le format attendu pour chaque champ du côté serveur.
  • Respecter le principe du moindre privilège : Le compte utilisateur servant à la connexion entre l’application web et la base de données ne doit disposer que des droits strictement nécessaires à son fonctionnement (SELECT, INSERT, UPDATE) et ne doit jamais posséder de privilèges d’administration système (root, sa ou DBA).
Schéma explicatif du filtrage des entrées SQL
Mécanisme de contrôle et de filtrage des paramètres entrants pour se prémunir des injections SQL. (Enkelena Haliti (CC BY-SA 3.0), via Wikimedia Commons.)

Avez-vous déjà fait face à des tentatives d’injection SQL dans les journaux de vos applications ? Quels outils d’analyse statique de code ou WAF privilégiez-vous dans votre quotidien d’administrateur ou développeur ? N’hésitez pas à partager vos expériences dans la section des commentaires ci-dessous !

Photo : Muhammed Ensar sur Pexels.

Pour aller plus loin

Liens affiliés Amazon : en tant que Partenaire Amazon, ce site perçoit une commission sur les achats éligibles réalisés via ces liens, sans coût supplémentaire pour vous.

Sécurité des applications web – Stratégies offensives et défensives, Malween Le Goffic

Un guide complet et pratique expliquant le fonctionnement offensif des failles web comme la SQLi et la manière de coder défensivement pour les éradiquer.

Sécurité informatique sur le Web – Apprenez à sécuriser vos applications, Jérôme Thémée

Un ouvrage didactique passant en revue le top 10 OWASP, l’architecture web sécurisée et la protection des bases de données.

Cybersécurité : définitions, concepts, métiers, Patrick Lallement

Un manuel synthétique permettant de comprendre l’ensemble des vulnérabilités applicatives et l’écosystème global de la sécurité du numérique.

Voir aussi

Sources

Publications similaires

Laisser un commentaire