Qu'est-ce qu'une injection SQL? [MakeUseOf explique]
Le monde de la sécurité Internet est en proie à des ports ouverts, des portes dérobées, des failles de sécurité, des chevaux de Troie, des vers, des vulnérabilités de pare-feu et une multitude d'autres problèmes qui nous tiennent tous sur le qui-vive tous les jours. Pour les utilisateurs privés, les virus et les vers semblent être la pire des possibilités. Mais pour ceux qui utilisent une base de données, l’injection SQL est l’une des failles de sécurité les plus destructrices du marché..
Les bases de données sont extrêmement utiles dans le domaine des ordinateurs. Ils sont essentiels pour stocker des données en mémoire et montrer les diverses relations entre les points de données. Chez MakeUseOf, nous avons de nombreuses bases de données dédiées à diverses tâches: une pour tous nos articles, une pour notre base d'utilisateurs, une pour notre programme de récompenses, et la liste continue. Que se passe-t-il lorsque nos bases de données sont attaquées de manière malveillante - voire détruites??
Lorsque vous n'avez pas réellement accès à une base de données, l'injection SQL est l'une des formes d'attaque les plus importantes. Continuez votre lecture pour savoir ce que c'est exactement et comment cela peut être si dangereux.
Qu'est-ce que SQL, en tout cas?
Pour comprendre l'injection SQL, vous devez d'abord comprendre ce qu'est le code SQL et son rapport avec un site Web. SQL, qui signifie Structured Query Language, est un type de langage de programmation optimisé pour la gestion des données tabulaires. À toutes fins utiles, il s’agit simplement d’un moyen pour les programmeurs de communiquer avec une base de données et de lui donner des commandes..
Chaque fois qu'une base de données est utilisée, des commandes SQL sont données et traitées. Si vous pensez à toutes les fois où une base de données est utilisée, vous en conclurez que cela ne se produit que dans quelques circonstances:
- Quand de nouvelles données doivent être insérées,
- Lorsque les données actuelles doivent être modifiées,
- Lorsque les anciennes données doivent être supprimées,
- Lorsqu'un élément de données particulier doit être recherché et récupéré.
Chaque fois que l'une de ces actions doit se produire, une commande SQL est en cours d'exécution quelque part sur un serveur. Pour la plupart, le programmeur doit déterminer quand et où ces commandes SQL apparaissent dans le code source. Cependant, il y a des circonstances inévitables lorsqu'un utilisateur peut forcer une manipulation de base de données - et ces opportunités sont tout autour de vous.
Avez-vous déjà connecté à un site Web? Avez-vous déjà posté un commentaire sur un article de blog ou une réponse dans un fil de discussion? Avez-vous déjà envoyé un message Facebook à un ami? Vous avez tapé un email dans Gmail? Vous avez cherché un site sur Google? Chaque fois que vous voyez un champ de saisie sur un site Web (nom d'utilisateur, mot de passe, requête de recherche, boîte de message, etc.), ce texte est envoyé à la base de données et traité..
Maintenant, si un utilisateur malveillant veut toucher à une base de données, il n’y a pas beaucoup de choix pour lui. Une possibilité serait de gagner physique accéder au serveur et le détruire à sa base. Mais sinon, il est plus logique que l’utilisateur malveillant détourne une commande SQL existante lorsqu’il utilise un champ de saisie, forçant ainsi le serveur à exécuter une commande différente de celle qui était initialement prévue..
La technique d'injection SQL
Ce geste de détournement d'une commande SQL existante est ce à quoi l'injection SQL fait référence. Pourquoi s'appelle-t-il injection? Parce que le piratage d'une commande SQL nécessite que l'utilisateur injecte son propre code SQL lors de l'utilisation d'un champ de saisie. Cela vous semble-t-il déroutant? Me laisser illustrer par un exemple.
Considérez la page de connexion de MakeUseOf. Lorsque vous entrez votre nom d'utilisateur et mot de passe et appuyez sur “Soumettre“, vous forcez le serveur Web à générer une commande SQL impliquant les informations que vous venez de donner, à savoir votre nom d'utilisateur et votre mot de passe. La base de données reçoit les informations, vérifie que la combinaison nom d'utilisateur / mot de passe est correcte, puis vous donne le bon accès à d'autres zones du site..
Maintenant, imaginez ce qui se passerait si un utilisateur malveillant ne saisissait pas son nom d’utilisateur et son mot de passe, mais tapait à la place une commande SQL comme nom d’utilisateur. Si le code du serveur n'est pas correctement sécurisé, la base de données recevra le nom d'utilisateur défectueux (qui est en réalité une commande SQL) et l'exécutera en tant que commande..
Et c'est pourquoi ça s'appelle l'injection. La commande SQL est injectée dans la base de données par des moyens tout à fait légitimes, en la manipulant de manière à faire quelque chose que ce n’était pas censé faire..
Un exemple avancé
Jusqu'à présent, j'ai décrit l'injection SQL en termes de haut niveau afin que tout le monde puisse comprendre, même ceux qui ne maîtrisent pas la programmation. Dans cette section, je vais donner un exemple réel de Comment cette technique est possible. Si vous êtes un débutant en SQL, ou si vous n’avez jamais traité de programmation auparavant, vous pouvez ignorer cette section.
Lors de la connexion à un site Web, voici une façon possible d’écrire le code en SQL:
SELECT user_id
FROM users_db
WHERE username = "$ username" AND password = "$ password"
En gros, la commande demande à la base de données de renvoyer tous user_ids de la table utilisateurs_db qui correspondent à la combinaison nom d'utilisateur et mot de passe entrée. On dirait que tout va bien, à droite?
Supposons que le formulaire de connexion ait reçu les entrées suivantes:
Nom d'utilisateur: David
Mot de passe: fubar 'OR' x '=' x
Notez que le champ mot de passe ne commence ni ne se termine par une apostrophe. Lorsque le serveur reçoit cette tentative de connexion, il prend tout ce qui est indiqué dans le champ mot de passe et le met à la place du mot de passe $ dans le code. La commande SQL résultante ressemblera à ceci:
SELECT user_id
FROM users_db
WHERE username = "David" AND password = 'fubar 'OR' x '=' x'
Lorsque le serveur exécute cette commande, la dernière partie de cette commande SQL toujours retourne vrai. Cela signifie que l'utilisateur malveillant peut entrer n'importe quel nom d'utilisateur et accéder instantanément à ce compte, car la connexion fonctionnerait, qu'il ait ou non le bon mot de passe..
Bien sûr, ouvrir une session sur le compte de quelqu'un est un délit mineur lorsque vous le comparez à toutes les autres tentatives de piratage possibles: supprimer des bases de données entières, récupérer toutes les données ou même vol les données dans les bases de données.
Les développeurs Web professionnels parviennent de mieux en mieux à prévenir de telles astuces, mais de temps en temps, vous entendez dire qu'une entreprise a subi une perte à la suite d'une attaque par injection SQL. Quand cela se produit, vous savez maintenant ce que cela signifie et comment c'est possible.
Crédit image: Intro Image via Shutterstock, schéma de base de données via Shutterstock, HACKED via Shutterstock