Tutoriel d'injection SQL : apprendre avec un exemple
⚡ Résumé intelligent
L'injection SQL est une attaque qui consiste à corrompre les requêtes SQL dynamiques afin de contourner l'authentification ou de divulguer des données, en exploitant les applications web qui construisent leurs requêtes à partir de données utilisateur non filtrées. Cette page explique le fonctionnement de cette attaque et comment s'en prémunir.

Qu’est-ce qu’une injection SQL ?
L'injection SQL est une attaque qui consiste à corrompre les requêtes SQL dynamiques en commentant certaines parties de la requête ou en y ajoutant une condition toujours vraie. Elle exploite les failles de conception des applications web mal conçues pour exécuter du code SQL malveillant.
Les données constituent l'un des éléments les plus essentiels des systèmes d'information. Les applications web basées sur des bases de données sont utilisées par les organisations pour obtenir des données auprès de leurs clients. SQL est l'acronyme de Langage de requête structuréIl sert à extraire et à manipuler des données dans la base de données.
Comment fonctionne une attaque par injection SQL ?
Les types d'attaques réalisables par injection SQL varient selon le moteur de base de données. L'attaque exploite les requêtes SQL dynamiques, c'est-à-dire des requêtes générées à l'exécution à partir de paramètres transmis via un formulaire web ou une chaîne de requête URI.
Exemple d'injection SQL
Prenons l'exemple d'une application web simple avec un formulaire de connexion. Le code HTML du formulaire 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 offre la possibilité de stocker la session de connexion dans un cookie. Nous l'avons déduit de la case à cocher « Se souvenir de moi ». Il utilise la méthode POST pour soumettre les données. Cela signifie que les valeurs ne sont pas affichées dans le URL.
Supposons que la requête côté serveur pour vérifier l'identifiant de l'utilisateur soit la suivante.
SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);
ICI,
- L'instruction ci-dessus utilise directement les valeurs du tableau $_POST[] sans les nettoyer.
- Le mot de passe est haché à l'aide de l'algorithme MD5.
Nous allons illustrer une attaque par injection SQL en utilisant SQL Fiddle. Ouvrez le URL http://sqlfiddle.com/ dans votre navigateur Internet. Vous obtiendrez la fenêtre suivante.
Remarque : vous devrez rédiger les instructions SQL.
Étape 1) Saisissez 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 « Générer le schéma ».
Étape 3) Saisissez ce code dans le volet de droite.
select * from users;
Étape 4) Cliquez sur « Exécuter SQL ». Le résultat suivant s’affichera.
Supposons qu'un utilisateur fournisse admin@admin.sys et 1234 comme mot de passe. La requête exécutée 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 relative au mot de passe et en ajoutant une condition qui sera toujours vraie. Supposons qu'un attaquant saisisse l'adresse électronique suivante.
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 une apostrophe qui complète la citation.
OR 1 = 1LIMIT 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 dans le SQL Fiddle Exé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/ Ce code est vulnérable aux attaques par injection SQL à des fins de démonstration uniquement. Le code HTML du formulaire ci-dessus provient de la page de connexion. L'application assure une sécurité de base, notamment en nettoyant le champ e-mail. Par conséquent, le code présenté ci-dessus ne peut pas être utilisé pour contourner la connexion.
Pour contourner ce problème, nous utilisons plutôt le champ du mot de passe. Le schéma ci-dessous illustre les étapes à suivre.
Supposons qu'un attaquant fournisse les données d'entrée suivantes.
- É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.
La requête 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 comment l'instruction est générée.
ICI,
- Cette déclaration présuppose intelligemment que le chiffrement MD5 est utilisé.
- Complète l'apostrophe et la parenthèse fermante.
- Ajoute une condition à l'énoncé qui sera toujours vraie.
En général, une attaque réussie combine plusieurs techniques comme celles présentées ci-dessus.
Autres types d'attaques par injection SQL
Les injections SQL peuvent causer des dommages bien plus importants que le simple contournement des algorithmes de connexion. Voici quelques exemples d'attaques :
- 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
- Récupération des informations de connexion des utilisateurs, 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 ; elle vous donne simplement une idée de ce que peut faire une injection SQL.
Outils d'automatisation pour l'injection SQL
Dans l'exemple ci-dessus, nous avons utilisé des techniques d'attaque manuelles s'appuyant sur notre connaissance approfondie de SQL. Il existe des outils automatisés permettant de réaliser des attaques plus efficacement et dans les plus brefs délais. Ces outils comprennent :
- Carte SQL – http://sqlmap.org/
- Injection jSQL – https://www.kali.org/tools/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 données saisies par l'utilisateur. – Il doit toujours être nettoyé avant d'être utilisé dans des instructions SQL dynamiques.
- Procédures stockées – Ces éléments peuvent encapsuler les instructions SQL et traiter toutes les entrées comme des paramètres.
- Déclarations préparées Les requêtes préparées fonctionnent 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 impact sur la syntaxe de l'instruction SQL.
- Expressions régulières – ces outils peuvent être utilisés pour détecter un code potentiellement dangereux et le supprimer avant l'exécution des instructions SQL.
- droits d'accès utilisateur à la connexion à la base de données – seuls les droits d’accès nécessaires devraient ê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 Ces messages ne doivent pas révéler d'informations sensibles ni l'emplacement précis de l'erreur. Des messages d'erreur simples et personnalisés, tels que « Désolé, nous rencontrons actuellement des problèmes techniques. L'équipe technique a été contactée. Veuillez réessayer plus tard. », peuvent être utilisés à la place des instructions SQL ayant provoqué l'erreur.
Activité de piratage : utilisez Havij pour l'injection SQL
Dans ce scénario pratique, nous utilisons le programme Havij Advanced SQL Injection pour analyser un site web à la recherche de vulnérabilités.
Remarque : Havij est un site web ancien et non mis à jour. Windows L'outil SQLMap, mentionné ci-dessus, est la norme open source actuelle.
Remarque : votre programme antivirus peut le signaler en raison de sa nature. Vous devriez l’ajouter à la liste des exclusions ou suspendre votre antivirus. programme antivirus.
L'image ci-dessous montre la fenêtre principale de Havij.
L'outil mentionné ci-dessus peut être utilisé pour évaluer la vulnérabilité d'un site web ou d'une application.








