Grâce à l'injection SQL, les pirates peuvent exécuter des commandes non autorisées sur la base de données SQL d'une victime.
Cet article s'articule autour des points suivants :
Contenu associé
Qu'est-ce que la sécurité des applications web ?
Falsification de requêtes intersites
Qu'est-ce qu'une violation de données ?
Attaque par débordement de tampon
Qu'est-ce que le classement OWASP Top 10 ?
Abonnez-vous à theNET, le récapitulatif mensuel par Cloudflare des informations les plus populaires sur Internet !
Copier le lien de l'article
L’injection SQL (Structured Query Language)* est une technique d’injection de code utilisée pour modifier ou récupérer des données dans des bases de données SQL. En insérant des instructions SQL spécialisées dans un champ de saisie, un attaquant est capable d’exécuter des commandes qui permettent de récupérer des données de la base de données, la destruction de données sensibles ou encore de les manipuler par d’autres comportements.
Avec une exécution correcte des commandes SQL, l'utilisateur non autorisé peut usurper l'identité d'un utilisateur plus privilégié, se faire passer lui-même ou les autres pour des administrateurs de base de données, altérer les données existantes, modifier les transactions et les soldes, et récupérer et/ou détruire toutes les données du serveur.
Dans l'informatique moderne, l'injection SQL se produit généralement sur Internet en envoyant des requêtes SQL malveillantes aux paramètres de l'API fourni par un site web ou un service (plus d'informations à ce sujet plus loin). Dans sa forme la plus sévère, l'injection SQL peut permettre à un pirate d'accéder à la racine d'une machine, ce qui lui donne un contrôle total.
*SQL est un langage de programmation utilisé pour la maintenance de la plupart des bases de données.
Imaginez une salle d'audience dans laquelle un homme nommé Bob est en procès et est sur le point de comparaître devant un juge. Lorsqu'il remplit des documents avant le procès, Bob écrit son nom comme « Bob est libre de partir ». Lorsque le juge arrive à son affaire et lit à haute voix « A présent, appelons Bob est libre de partir », l'huissier laisse Bob partir parce que le juge l'a dit.
Bien qu'il existe des variétés légèrement différentes de SQLi, la vulnérabilité principale est essentiellement la même : un champ de requête SQL qui est censé être réservé à un type particulier de données, comme un nombre, se voit plutôt transmettre des informations inattendues, comme une commande. La commande, lorsqu'elle est exécutée, franchit les limites prévues, ce qui permet un comportement potentiellement malveillant. Un champ de requête est généralement rempli à partir de données saisies dans un formulaire sur une page web.
Examinons une comparaison simple entre les instructions SQL normales et malveillantes :
Dans cette requête SQL normale, la chaîne studentId est passée dans une instruction SQL. L'objectif est de rechercher dans la liste des étudiants un étudiant qui correspond au studentId saisi. Une fois trouvé, l'enregistrement de cet étudiant sera renvoyé. En termes simples, la commande dit « allez trouver cet utilisateur et donnez-moi ses données ».
Le code pourrait ressembler à quelque chose comme ceci :
studentId = getRequestString(« studentId ») ;
lookupStudent = « SELECT * FROM students WHERE studentId = » + studentId
Si un étudiant saisit un identifiant d'étudiant de 117 dans un formulaire de page web intitulé "Veuillez fournir votre numéro d'identifiant d'étudiant
la requête SQL résultante ressemblera à :
SELECT * FROM students WHERE studentId = 117 ;
Cette commande renvoie l'enregistrement de l'étudiant en question avec un studentId, ce que le développeur qui a écrit l'API s'attend à voir se produire.
Dans cet exemple, un pirate saisit plutôt une commande SQL ou une logique conditionnelle dans le champ de saisie, il saisit un numéro d'identification d'étudiant de :
Alors que normalement la requête recherchait l'identifiant correspondant dans la table de la base de données, elle recherche maintenant un identifiant ou teste si 1 est égal à 1. Comme on peut s'y attendre, l'énoncé est toujours vrai pour chaque étudiant de la colonne et, par conséquent, la base de données renvoie toutes les données de la table des étudiants à l'attaquant qui effectue la requête.
SELECT * FROM students WHERE studentId = 117 OR 1=1;
SQLi fonctionne en ciblant une interface de programmation d'application ou API vulnérable. Une API est dans ce cas l'interface logicielle par laquelle un serveur reçoit et répond aux demandes.
Il existe des outils couramment utilisés qui permettent à un pirate d'effectuer une recherche automatique sur un site web à la recherche de formulaires, puis de tenter de saisir diverses requêtes SQL susceptibles de générer une réponse que les développeurs de logiciels du site web n'avaient pas prévue afin d'exploiter la base de données.
Les injections SQL sont faciles à mettre en œuvre et, fait intéressant, assez faciles à prévenir grâce aux bonnes pratiques de développement. La réalité est plus sombre, car les délais serrés, les développeurs inexpérimentés et le code existant entraînent souvent une qualité de code et des pratiques de sécurité variables. Un seul champ vulnérable sur un formulaire ou aux paramètres de l'API sur un site web ayant accès à une base de données peut suffire à exposer une vulnérabilité.
Il existe plusieurs méthodes pour réduire le risque d'une violation des données due à l'injection SQL. La meilleure pratique consiste à utiliser plusieurs stratégies. Examinons quelques-unes des mises en œuvre les plus courantes :
Afin de contourner les mesures de sécurité, des pirates astucieux mettent parfois en œuvre des attaques multi vecteurs contre un site Web ciblé. Si une attaque unique peut être atténuée, elle peut aussi devenir le centre d'attention des administrateurs de bases de données et des équipes de sécurité de l'information. Les attaques DDoS, le détournement de DNS et d'autres méthodes de perturbation sont parfois utilisées comme diversion pour mettre en œuvre des attaques par injection SQL de grande envergure. Par conséquent, une stratégie globale d'atténuation des menaces offre le plus large éventail de protection. Le pare-feu des applications web de Cloudflare, l'atténuation des attaques DDoS et la sécurité DNS constituent les éléments essentiels d'une stratégie de sécurité globale.
L'injection SQL est un type de cyberattaque au cours de laquelle les attaquants insèrent des commandes SQL malveillantes dans des champs de saisie. Si les commandes sont exécutées, les attaquants peuvent manipuler ou extraire des informations d'une base de données sans autorisation. En termes plus simples, une injection SQL se produit lorsque des attaquants soumettent du code exécutable à des endroits où une application attend des données ordinaires.
Les attaquants saisissent une commande SQL dans un champ de formulaire. Une fois le formulaire soumis, le backend de l'application reçoit la commande et l'exécute effectivement. Cela génère une réponse ou une action que les développeurs de l'application n'avaient pas prévue : les attaquants peuvent utiliser l'injection SQL pour obtenir des informations confidentielles d'une base de données ou en modifier le contenu.
Une injection SQL réussie peut permettre aux attaquants d'usurper des identités d'utilisateurs, d'obtenir des privilèges administratifs, de modifier ou de supprimer des données, de récupérer toutes les données du serveur, ou encore d'obtenir un accès à la racine de la machine.
Les stratégies de prévention des injections SQL comprennent l'utilisation d'instructions préparées, la neutraliser des caractères spéciaux dans les entrées utilisateur, la mise en œuvre de procédures stockées et l'application du principe du moindre privilège pour garantir que seules les autorisations nécessaires sont accordées.
Les instructions préparées séparent le code SQL des entrées utilisateur en précompilant le code SQL. Cela empêche les attaquants d'injecter du code malveillant, car la base de données traite les entrées comme des données et non comme des commandes exécutables.
La neutralisation des caractères spéciaux dans les entrées utilisateur garantit que les caractères spéciaux sont traités comme du texte brut et non comme une partie d'une commande SQL, ce qui réduit le risque que les entrées utilisateur soient interprétées comme des instructions exécutables.
Les procédures stockées peuvent restreindre les types et la portée des opérations de base de données. Lorsqu'elles sont conçues correctement, elles limitent ce que le code injecté peut faire ; elles ne constituent toutefois pas, à elles seules, une défense complète.
L'application du principe du moindre privilège signifie limiter les autorisations des comptes de base de données à ce qui est strictement nécessaire. Cela minimise les dommages potentiels si un attaquant exploite une vulnérabilité d'injection SQL.