Tutoriel d'injection SQL : comment apprendre avec un exemple
Qu’est-ce qu’une injection SQL ?
L'injection SQL est une attaque qui empoisonne les instructions SQL dynamiques pour commenter certaines parties de l'instruction ou ajouter une condition qui sera toujours vraie. Il profite des défauts de conception des applications Web mal conçues pour exploiter les instructions SQL afin d'exécuter du code SQL malveillant.
Les données sont l’un des composants les plus vitaux des systèmes d’information. Les applications Web basées sur des bases de données sont utilisées par l'organisation pour obtenir des données auprès des clients. SQL est l'acronyme de Structured Query Language. Il est utilisé pour récupérer et manipuler des données dans la base de données.
Comment fonctionne l’attaque par injection SQL ?
Les types d'attaques pouvant être effectuées à l'aide de l'injection SQL varient en fonction du type de moteur de base de données. L'attaque fonctionne sur des instructions SQL dynamiques. Une instruction dynamique est une instruction générée au moment de l'exécution à l'aide du mot de passe des paramètres d'un formulaire Web ou d'une chaîne de requête URI.
Exemple d'injection SQL
Considérons une simple application Web avec un formulaire de connexion. Le code du formulaire HTML est présenté ci-dessous.
<form action=‘index.php’ method="post"> <input type="email" name="email" required="required"/> <input type="password" name="password"/> <input type="checkbox" name="remember_me" value="Remember me"/> <input type="submit" value="Submit"/> </form>
ICI,
- Le formulaire ci-dessus accepte l'adresse e-mail et le mot de passe, puis les soumet à un PHP fichier nommé index.php.
- Il a la possibilité de stocker la session de connexion dans un cookie. Nous l'avons déduit de la case à cocher Remember_me. Il utilise la méthode post pour soumettre les données. Cela signifie que les valeurs ne sont pas affichées dans l'URL.
Supposons que l'instruction du backend pour vérifier l'ID utilisateur soit la suivante
SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);
ICI,
- L'instruction ci-dessus utilise les valeurs de
$_POST[]
tableau directement sans les désinfecter. - Le mot de passe est crypté à l'aide de l'algorithme MD5.
Nous illustrerons l'attaque par injection SQL à l'aide de sqlfiddle. Ouvrez l'URL http://sqlfiddle.com/ dans votre navigateur Internet. Vous obtiendrez la fenêtre suivante.
Remarque : vous devrez écrire les instructions SQL
Étape 1) Entrez ce code dans le volet de gauche
CREATE TABLE `users` ( `id` INT NOT NULL AUTO_INCREMENT, `email` VARCHAR(45) NULL, `password` VARCHAR(45) NULL, PRIMARY KEY (`id`)); insert into users (email,password) values ('m@m.com',md5('abc'));
Étape 2) Cliquez sur Créer un schéma
Étape 3) Entrez ce code dans le volet de droite
select * from users;
Étape 4) Cliquez sur Exécuter SQL. Vous verrez le résultat suivant
Supposons que l'utilisateur fournisse admin@admin.sys et 1234 comme mot de passe. L'instruction à exécuter sur la base de données serait
SELECT * FROM users WHERE email = 'admin@admin.sys' AND password = md5('1234');
Le code ci-dessus peut être exploité en commentant la partie mot de passe et en ajoutant une condition qui sera toujours vraie. Supposons qu'un attaquant fournisse l'entrée suivante dans le champ de l'adresse e-mail.
xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ]
xxx pour le mot de passe.
L'instruction dynamique générée sera la suivante.
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ] AND password = md5('1234');
ICI,
- xxx@xxx.xxx se termine par un guillemet simple qui complète la chaîne de guillemets
OR 1 = 1
LIMIT 1 est une condition qui sera toujours vraie et limitera les résultats renvoyés à un seul enregistrement.- — ' AND … est un commentaire SQL qui élimine la partie mot de passe.
Copiez l'instruction SQL ci-dessus et collez-la SQL FiddleExécutez la zone de texte SQL comme indiqué ci-dessous
Activité de piratage : SQL injecte une application Web
Nous avons une application Web simple à http://www.techpanda.org/ qui est vulnérable aux attaques par injection SQL à des fins de démonstration uniquement. Le code du formulaire HTML ci-dessus provient de la page de connexion. L'application offre une sécurité de base telle que la désinfection du champ de courrier électronique. Cela signifie que notre code ci-dessus ne peut pas être utilisé pour contourner la connexion.
Pour contourner cela, on peut plutôt exploiter le champ mot de passe. Le schéma ci-dessous montre les étapes que vous devez suivre
Supposons qu'un attaquant fournisse l'entrée suivante :
- Étape 1 : Saisissez xxx@xxx.xxx comme adresse e-mail
- Étape 2 : Saisissez xxx') OU 1 = 1 — ]
- Cliquez sur le bouton Soumettre
- Vous serez dirigé vers le tableau de bord
L'instruction SQL générée sera la suivante
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');
Le diagramme ci-dessous illustre que la déclaration a été générée.
ICI,
- La déclaration suppose intelligemment que le cryptage md5 est utilisé
- Complète le guillemet simple et la parenthèse fermante
- Ajoute une condition à l'instruction qui sera toujours vraie
En général, une attaque par injection SQL réussie utilise un certain nombre de techniques différentes, telles que celles illustrées ci-dessus, pour mener à bien une attaque.
Autres types d'attaques par injection SQL
Les injections SQL peuvent faire plus de mal que simplement transmettre les algorithmes de connexion. Certaines des attaques incluent
- Supprimer des données
- Mise à jour des données
- Insertion de données
- Exécuter des commandes sur le serveur permettant de télécharger et d'installer des programmes malveillants tels que des chevaux de Troie
- Exportation de données précieuses telles que les détails de la carte de crédit, les e-mails et les mots de passe vers le serveur distant de l'attaquant
- Obtenir les informations de connexion de l'utilisateur, etc.
- Injection SQL basée sur des cookies
- Injection SQL basée sur les erreurs
- Injection SQL aveugle
La liste ci-dessus n'est pas exhaustive ; cela vous donne juste une idée de ce qu'est l'injection SQL
Outils d'automatisation pour l'injection SQL
Dans l'exemple ci-dessus, nous avons utilisé des techniques d'attaque manuelle basées sur notre vaste connaissance de SQL. Il existe des outils automatisés qui peuvent vous aider à réaliser des attaques plus efficacement et dans les plus brefs délais. Ces outils comprennent
- Carte SQL – http://sqlmap.org/
- Injection JSQL – https://tools.kali.org/vulnerability-analysis/jsql
Comment prévenir les attaques par injection SQL
Une organisation peut adopter la stratégie suivante pour se protéger contre les attaques par injection SQL.
- Il ne faut jamais faire confiance aux entrées des utilisateurs – Il doit toujours être nettoyé avant d'être utilisé dans des instructions SQL dynamiques.
- Procédures stockées - ceux-ci peuvent encapsuler les instructions SQL et traiter toutes les entrées comme des paramètres.
- Déclarations préparées – les instructions préparées pour fonctionner en créant d'abord l'instruction SQL, puis en traitant toutes les données utilisateur soumises comme des paramètres. Cela n'a aucun effet sur la syntaxe de l'instruction SQL.
- Expressions régulières - ceux-ci peuvent être utilisés pour détecter le code potentiellement dangereux et le supprimer avant d'exécuter les instructions SQL.
- Droits d’accès des utilisateurs de connexion à la base de données – seuls les droits d'accès nécessaires doivent être accordés aux comptes utilisés pour se connecter à la base de données. Cela peut contribuer à réduire ce que les instructions SQL peuvent effectuer sur le serveur.
- Messages d'erreur - ceux-ci ne doivent pas révéler d’informations sensibles ni l’endroit exact où une erreur s’est produite. Des messages d'erreur personnalisés simples tels que « Désolé, nous rencontrons des erreurs techniques. L'équipe technique a été contactée. Veuillez réessayer plus tard » peut être utilisé au lieu d'afficher les instructions SQL à l'origine de l'erreur.
Activité de piratage : utilisez Havij pour l'injection SQL
Dans ce scénario pratique, nous allons utiliser le programme Havij Advanced SQL Injection pour analyser un site Web à la recherche de vulnérabilités.
Remarque: votre programme antivirus peut le signaler en raison de sa nature. Vous devez l'ajouter à la liste des exclusions ou suspendre votre logiciel antivirus.
L'image ci-dessous montre la fenêtre principale de Havij
L'outil ci-dessus peut être utilisé pour évaluer la vulnérabilité d'un site/d'une application Web.
Résumé
- L'injection SQL est un type d'attaque qui exploite de mauvaises instructions SQL
- L'injection SQL peut être utilisée pour contourner les algorithmes de connexion, récupérer, insérer, mettre à jour et supprimer des données.
- Les outils d'injection SQL incluent SQLMap, SQLPing et SQLSmack, etc.
- Une bonne politique de sécurité lors de l’écriture d’une instruction SQL peut aider à réduire les attaques par injection SQL.