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.

  • ???? Définition: L'injection SQL insère du code SQL malveillant dans une requête via un champ de saisie non validé.
  • (I.e. Impact: Une attaque réussie peut contourner les identifiants de connexion et lire, modifier ou supprimer des enregistrements.
  • 🧪 Exemple : Une condition toujours vraie, associée à un commentaire, transforme une vérification de connexion en un contournement.
  • ️ Outils: SQLMap et jSQL automatisent la détection et l'exploitation des paramètres injectables.
  • 🛡️ La prévention: Les requêtes paramétrées, la validation des entrées et les comptes à privilèges minimaux permettent de combler l'écart.
  • 🤖 Avantage moderne : Les scanners et pare-feu pilotés par l'IA signalent les schémas d'injection que les signatures corrigées ne parviennent pas à identifier.

Tutoriel sur l'injection SQL

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.

Schéma illustrant comment une injection SQL manipule une requête de base de données dynamique

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.

Vide SQL Fiddle Fenêtre prête pour le schéma et la requête

É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.

SQL Fiddle résultat affichant l'enregistrement de l'utilisateur unique renvoyé

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 = 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 dans le SQL Fiddle Exécutez la zone de texte SQL comme indiqué ci-dessous.

SQL Fiddle renvoyer l'enregistrement après l'exécution de la condition injectée

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.

Diagramme de flux des étapes d'injection du champ mot de passe du formulaire de connexion

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 — ]

Formulaire de connexion avec la chaîne d'injection saisie dans le champ mot de passe

  • 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.

Explication détaillée du processus de génération de l'instruction SQL injecté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 :

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.

Fenêtre principale de l'outil d'injection SQL Havij

L'outil mentionné ci-dessus peut être utilisé pour évaluer la vulnérabilité d'un site web ou d'une application.

FAQ

Uniquement avec l'autorisation écrite du propriétaire du site. Tester une application qui ne vous appartient pas est illégal, notamment en vertu de la loi américaine sur la fraude et les abus informatiques (Computer Fraud and Abuse Act). Les périmètres des programmes de primes aux bogues définissent ce qui est autorisé.

Oui. Dans le Top 10 de l'OWASP 2025, l'injection SQL est classée A05, et les tests révèlent encore sa présence dans la quasi-totalité des applications. Avec des milliers de nouvelles vulnérabilités d'injection SQL (CVE) chaque année, elle demeure un risque majeur sur le web.

MD5 est un algorithme de hachage rapide, et non de chiffrement. Les attaquants peuvent facilement le casser grâce aux tables arc-en-ciel et aux GPU. Il est donc recommandé d'utiliser un algorithme lent et salé, comme bcrypt ou Argon2, pour la protection des mots de passe.

Toute base de données interrogée via du SQL construit dynamiquement — MySQL, PostgreSQL, Microsoft SQL Server, Oracle et SQLiteLe problème réside dans la manière dont l'application concatène les données saisies par l'utilisateur dans les requêtes, et non dans le moteur de base de données.

Les pare-feu et les scanners basés sur l'IA apprennent les schémas de trafic normaux, puis signalent en temps réel les entrées anormales telles que les conditions ou les commentaires injectés. Les modèles d'apprentissage automatique détectent les charges utiles obfusquées que les signatures fixes ne repèrent pas.

Les assistants IA comme Copilote GitHub Ces outils peuvent suggérer des requêtes paramétrées et une validation des entrées, mais ils reproduisent également des schémas non sécurisés. Considérez chaque suggestion comme une ébauche et soumettez-la à un analyseur de sécurité et à une vérification.

L'injection SQL cible la base de données en injectant du code SQL dans les requêtes côté serveur. Le cross-site scripting (XSS) cible les autres utilisateurs en injectant des scripts qui s'exécutent dans leur navigateur. L'une expose des données ; l'autre détourne les sessions.

Un ORM (outil de mappage objet-relationnel) construit les requêtes à partir d'objets de code paramétrés par défaut, empêchant ainsi la plupart des injections SQL. Il n'est cependant pas infaillible : les requêtes brutes et les méthodes non sécurisées présentent toujours des risques de fuite, la validation reste donc essentielle.

Résumez cet article avec :