Injection SQL
Comprendre et exploiter cette vulnérabilité
Notions théoriques
L'injection SQL est l'une des attaques les plus courantes et dangereuses en cybersécurité.
Elle permet à un attaquant d'exécuter des requêtes SQL malveillantes sur une base de données en exploitant une faille dans un formulaire ou une URL mal sécurisée.
Fonctionnement de l'injection SQL
Lorsqu'un site Web interagit avec une base de données, il utilise des requêtes SQL pour récupérer, insérer, modifier ou supprimer des données (CRUD).
Si les requêtes SQL ne sont pas correctement sécurisées, un attaquant peut injecter du code SQL malveillant pour manipuler la base de données.
Exemple de vulnérabilité
Prenons un site avec un formulaire de connexion :
SELECT * FROM utilisateurs WHERE username = '$utilisateur' AND password = '$mot_de_passe';
Si l'application insère directement les valeurs de l'utilisateur sans vérification, un attaquant peut entrer :
- Nom d'utilisateur :
admin' --
- Mot de passe : (vide)
Ce qui donnera la requête suivante :
SELECT * FROM utilisateurs WHERE username = 'admin' --' AND password = '';
Le --
transforme le reste de la requête en commentaire, permettant à l'attaquant de se connecter sans mot de passe.
Types d'injections SQL
-
Injection classique :
L'attaquant insère du code SQL directement dans les champs de saisie.
-
Blind SQL Injection :
L'attaquant ne voit pas directement les résultats mais peut deviner des informations en analysant les réponses du serveur.
-
Time-based SQL Injection :
L'attaquant utilise des requêtes qui ralentissent la réponse du serveur pour détecter des vulnérabilités.
Comment se protéger ?
- Utilisation des requêtes préparées (
Prepared Statements
) pour éviter l'injection. - Validation des entrées : Vérifier et filtrer les données saisies par l'utilisateur.
- Utilisation de privilèges limités : Ne pas donner trop de droits aux utilisateurs de la base de données.
- Désactivation des erreurs SQL visibles : Ne pas afficher les messages d'erreur SQL à l'utilisateur.
Exemple pratique
Exploitation d'une injection SQL
Nous allons voir comment une simple injection SQL peut permettre d'accéder à une base de données non sécurisée.
Contexte
Un site Web possède un formulaire de connexion avec cette requête SQL vulnérable :
SELECT * FROM utilisateurs WHERE username = '$utilisateur' AND password = '$mot_de_passe';
Un attaquant peut essayer de contourner l'authentification en entrant :
- Nom d'utilisateur :
' OR 1=1 --
- Mot de passe : (vide)
Cette entrée modifie la requête SQL comme suit :
SELECT * FROM utilisateurs WHERE username = '' OR 1=1 --' AND password = '';
Explication :
OR 1=1
est toujours vrai, donc la condition est validée pour tous les utilisateurs.--
transforme le reste en commentaire, supprimant la vérification du mot de passe.