Qu’est-ce que l’injection SQL (SQLi) ?
L’injection SQL (SQLi) est un type d’attaque où les attaquants saisissent une instruction SQL malveillante dans un champ de saisie pour manipuler la base de données.
Cette attaque cible les applications qui ne gèrent pas correctement la validation et les saisies utilisateur, permettant un accès non autorisé à des données sensibles telles que les mots de passe ou les détails de carte de crédit, etc.
Comment fonctionne l’injection SQL
Lorsqu’une application inclut directement une saisie utilisateur dans une requête de base de données sans validation appropriée, les attaquants peuvent modifier le comportement de la requête pour y insérer une instruction SQL malveillante.
Par exemple :
SELECT * FROM users WHERE username = 'admin' AND password = '12345';
Un attaquant pourrait saisir :
' OR '1'='1
Résultant en :
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '';
Cela retourne toujours vrai, accordant un accès non autorisé.
Pourquoi l’injection SQL est importante en cybersécurité
L’injection SQL est la technique la plus dangereuse et la plus ancienne en cybersécurité. Ce type d’attaque figure constamment dans le Top 10 de l’OWASP.
Même de petites vulnérabilités permettent à un attaquant de :
- Accéder, modifier ou supprimer des données
- Contourner l’authentification
- Exécuter des opérations administratives sur la base de données.
- Compromettre l’ensemble du système.
Types Courants d’Injection SQL
- SQLi Classique : Injection directe via des formulaires web ou des paramètres d’URL.
- SQLi Aveugle : Les attaquants déduisent indirectement des informations de la base de données (par exemple, via des messages d’erreur ou le temps de réponse).
- SQLi Basé sur UNION : Utilise l’opérateur UNION pour combiner les résultats de plusieurs requêtes.
- SQLi Basé sur les Erreurs : S’appuie sur les messages d’erreur de la base de données pour extraire des informations.
- SQLi Aveugle Basé sur le Temps : Exploite les délais de réponse du serveur pour deviner les résultats des requêtes.
Comment Prévenir l’Injection SQL
1. Utiliser des Requêtes Paramétrées (Instructions Préparées)
Assurez-vous que les commandes SQL traitent les entrées utilisateur comme des données, et non comme du code exécutable.
cursor.execute("SELECT * FROM users WHERE username = ?", (username,))
2. Validation et Assainissement des Entrées
Validez toutes les entrées des utilisateurs, en n’autorisant que les caractères attendus.
3. Utiliser des Cadres ORM
Des cadres comme Prisma, Hibernate, etc., réduisent la manipulation directe du SQL.
4. Principe du Moindre Privilège
Limitez les permissions des utilisateurs, ne donnez que les permissions nécessaires.
5. Tests de Sécurité Réguliers
Utilisez des outils de test de sécurité des applications comme SAST, DAST ou IAST pour détecter les failles d’injection tôt.
Exemple dans le monde réel
Un site web de magasin en ligne a subi une violation où des attaquants ont utilisé une injection SQL dans un formulaire de connexion pour extraire des détails de carte de crédit de sa base de données.
Termes connexes
- XSS (Cross-Site Scripting)
- DAST (Dynamic Application Security Testing)
- OWASP Top 10
- Application Security Testing