Pour interagir avec les bases de données, le langage informatique le plus approprié est le SQL ou Structured Query Language. Les applications web modernes utilisent des bases de données pour gérer les informations et proposer un contenu dynamique aux internautes. Cependant, il arrive qu'elles subissent une attaque informatique qui peut compromettre leur efficacité. Ce sont alors là des déclarations SQL malveillantes faites via une injection SQL ou SQLi. Puisque cela peut se produire régulièrement, il est bien d’en apprendre plus sur ce type d'injection. Voici un tutoriel pour comprendre les spécificités d'une injection SQL.
Les bases de la vulnérabilité d’injection SQL
Pour avoir un accès complet à une base de données à travers les instructions SQL malveillantes, vous devez vous servir de la vulnérabilité par injection SQL. Généralement, on relève dans une application web typique un flux de travail qui nécessite des requêtes via des entrées utilisateur. Pour faire une injection SQL, il faut viser un formulaire pour prendre l’entrée utilisateur. Il faut alors interroger la base de données avec les champs du formulaire soumis par l’utilisateur. Il faut structurer votre requête vers la base de données de la manière suivante :
1 | select * from user_table |
2 | where username = 'sdaityari' |
3 | and password = 'mypassword'; |
Pour faire plus simple, il faut prendre en considération que les mots de passe de la base de données sont stockés. Par conséquent, il faut penser à les protéger de manière optimale avant de les hacher par la suite. Vous obtiendrez alors le nom d’utilisateur ainsi que le mot de passe du formulaire. Cela vous permet alors d’établir votre requête en PHP de manière suivante :
1 | // Connect to SQL database |
2 | $db_query = "select * from user_table where |
3 | username = '".$user."' |
4 | AND password = '".$password."';"; |
5 | // Execute query |
Si un utilisateur saisit dans le champ réservé au nom d’utilisateur ou de la valeur « admin’;- », alors la variable $db_query génère la requête SQL résultante suivante :
1 | select * from user table where |
2 | username = 'admin';--' and password = 'mypassword' |
Les différents types d'injection SQL
Une fois que vous appréhendiez parfaitement les bases d’une vulnérabilité d’injection SQL, il est important de savoir explorer les divers types d’attaques d’injection SQL.
Injection Blind SQLi (SQL en aveugle)
L'injection SQL Blind SQLi constitue une attaque qui apporte des changements à la base de données avec des requêtes en aveugle. Principalement, cette injection SQL s’utilise lorsqu’une application est paramétrée pour afficher des messages d'erreur générique. Il est facile de considérer une requête afin de tester la présence ou non de l’ID d’un utilisateur. S’il n’existe pas, on pourra exiger du moteur, une attente de quelques secondes.
Il est relativement complexe de réaliser ce type d'attaque par injection SQL. En règle générale, cela est utilisé comme moyen de reconnaissance pour structurer le moteur SQL employé. Également, l'injection SQL en aveugle permet de se faire une idée du schéma de la base ou pour vérifier l’existence ou non d’un enregistrement par des tests sur les clés primaires.
Injection Error SQLi (SQL par l'erreur)
Il s’agit là d’une méthode d'exploitation dont l’objectif principal est de récupérer des informations sur le modèle de la base donnée. Cela se fait au moyen de soumission de requêtes SQL erronées et aux messages d'erreurs natifs du moteur de base de données.
Injection Union SQLi (SQL par union)
L'injection Union SQLi ou SQL par union représente une exploitation qui s’appuie sur l'emploi de l'opérateur UNION. Cette technique permet de combiner, en un seul jeu de données, divers jeux de résultats de nombreuses instructions SELECT. Elle sert également à faire l’exfiltration rapide de grandes quantités de données d'une application.
Injection Stacked Queries SQLi (SQL par sous requête et empilement)
L'injection Queries SQLi représente l’attaque SQL la plus dangereuse pour une base de données. Par son biais, plusieurs instructions peuvent être exécutées dans la même requête afin d’étendre les éventualités de l'injection SQL initiale. Cela permet à un attaquant de disposer d’un très grand niveau de contrôle. L’attaquant évite ainsi d’exécuter la requête d'origine qu’il pourra remplacer par une nouvelle requête SQL et faire ce qu'il veut. Le plus grand risque avec ce type d’injection SQL est que des commandes comme xp_shellcmd soient accessibles à l'environnement de la base de données. Ces commandes sont celles qui permettent d'exécuter directement du code Shell à travers une procédure stockée.
Injection XPATH (SQL par requête)
Ce type d’injection SQL dite par requête est entièrement dédié aux moteurs SQL grâce à qui les éléments XML comme le Transac-SQL sont manipulés. Une donnée non sécurisée est alors concaténée avec une chaine XPATH constitutive de la requête. Cela permet à un attaquant d'avoir accès à une autre donnée ou d’exécuter une nouvelle en annulant la requête précédente via la méthode Stacked queries.
Comment éviter les attaques par injection SQL ?
Il est difficile, voire impossible d’éviter les attaques par injection SQL, à moins d’être un développeur web. En effet, il revient aux personnes qui assurent la maintenance des sites web que vous utilisez d’assurer la prévention de ces attaques. De votre côté, il faut tout de même mettre au point quelques éléments sécurisants. Dans un premier temps, commencez par vérifier la compromission ou non de vos informations d’identification sur un site grâce à un outil adapté. Si votre identification est effectivement compromise, pensez juste à changer immédiatement le mot de passe de ce site afin d’éviter les risques de vol de données. Parmi les autres précautions à prendre pour protéger vos bases de données d’une injection SQL, il faut notamment :
- superviser la saisie automatique des applications ;
- s’assurer de la protection complète du serveur ;
- renforcer les bases de données et utiliser des codes sûrs ;
- appliquer de bonnes habitudes en matière de gestion des mots de passe, etc.
Bien qu’il soit impossible de prévenir les attaques par injection SQL, cet ensemble de mécanismes permet de limiter le risque de subir des dommages importants.
Comment détecter facilement une injection SQL ?
Il existe sur internet de nombreux outils qui sont spécifiquement dédiés à l’automatisation de la détection et/ou des failles de sécurité sur les sites internet. Vous pourrez en obtenir un gratuitement par téléchargement sur un site spécialisé. Par contre, le moteur de recherche Google, a mis en place des gages appelés « Dorks » grâce à qui, il est possible de découvrir très rapidement des sites possiblement sensibles aux injections SQL.
Dans ce cadre, il est même possible de filtrer les pages spécifiques à un site internet qui sont sensibles aux attaques par injection SQL. Si une plateforme web ou une base de données est sensible à de telles attaques, tôt ou tard, le système sera victime de son inattention. La majeure partie d'une attaque par injection SQL s'effectue en positionnant un métacaractère dans l'entrée dédiée aux données. Ensuite, elle applique une commande qui, en plus de la requête initiale prévue, sera interprétée par le système. Sur internet, vous pouvez aussi trouver facilement un site web qui regroupe sur ses pages, une grande partie des Google Dorks exploitables.