Tutoriel d'injection SQL: apprendre avec l'exemple

Table des matières:

Anonim

Les données sont l'une des composantes les plus vitales des systèmes d'information. Les applications Web basées sur une base 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.

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 tire parti des failles de conception des applications Web mal conçues pour exploiter les instructions SQL afin d'exécuter du code SQL malveillant.

Dans ce didacticiel, vous apprendrez les techniques d'injection SQL et comment vous pouvez protéger les applications Web contre de telles attaques.

  • Fonctionnement de l'injection SQL
  • Activité de piratage: injection SQL d'une application Web
  • Autres types d'attaques par injection SQL
  • Outils d'automatisation pour l'injection SQL
  • Comment prévenir les attaques par injection SQL
  • Activité de piratage: utiliser Havji pour l'injection SQL

Fonctionnement de l'injection SQL

Les types d'attaques pouvant être exécutés à 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 des paramètres mot de passe d'un formulaire Web ou d'une chaîne de requête URI.

Considérons une simple application Web avec un formulaire de connexion. Le code du formulaire HTML est présenté ci-dessous.

ICI,

  • Le formulaire ci-dessus accepte l'adresse e-mail, et le mot de passe les soumet ensuite à un fichier PHP 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 de publication pour soumettre des données. Cela signifie que les valeurs ne sont pas affichées dans l'URL.

Supposons que l'instruction au niveau du backend pour vérifier l'ID utilisateur soit la suivante

SELECT * FROM utilisateurs WHERE email = $ _POST ['email'] AND password = md5 ($ _ POST ['password']);

ICI,

  • L'instruction ci-dessus utilise les valeurs du tableau $ _POST [] directement sans les nettoyer.
  • Le mot de passe est chiffré à l'aide de l'algorithme MD5.

Nous illustrerons l'attaque par injection SQL en utilisant sqlfiddle. Ouvrez l'URL http://sqlfiddle.com/ dans votre navigateur Web. Vous obtiendrez la fenêtre suivante.

Remarque: vous devrez écrire les instructions SQL

Étape 1) Entrez ce code dans le volet 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 ('This email address is being protected from spambots. You need JavaScript enabled to view it.',md5('abc'));

Étape 2) Cliquez sur Créer un schéma

Étape 3) Entrez ce code dans le volet droit

sélectionnez * parmi les utilisateurs;

Étape 4) Cliquez sur Exécuter SQL. Vous verrez le résultat suivant

Supposons que l'utilisateur fournisse Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer JavaScript pour le visualiser. et 1234 comme mot de passe. L'instruction à exécuter sur la base de données serait

SELECT * FROM utilisateurs WHERE email = ' Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour le visualiser. ' AND mot de passe = 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 d'adresse e-mail.

Cette adresse e-mail est protégée du spam. Vous devez activer le JavaScript pour le visualiser. ' OU 1 = 1 LIMITE 1 - ']

xxx pour le mot de passe.

La déclaration dynamique générée sera la suivante.

SELECT * FROM utilisateurs WHERE email = ' Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour le visualiser. ' OU 1 = 1 LIMITE 1 - '] ET mot de passe = md5 (' 1234 ');

ICI,

  • Cette adresse e-mail est protégée du spam. Vous devez activer JavaScript pour le visualiser. se termine par un guillemet simple qui complète le guillemet de chaîne
  • OU 1 = 1 LIMIT 1 est une condition qui sera toujours vraie et limite 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 la zone de texte SQL FiddleRun SQL comme indiqué ci-dessous

Activité de piratage: injection SQL d'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 fournit une sécurité de base telle que la désinfection du champ de messagerie. Cela signifie que notre code ci-dessus ne peut pas être utilisé pour contourner la connexion.

Pour contourner cela, nous pouvons à la place exploiter le champ du mot de passe. Le diagramme ci-dessous montre les étapes à suivre

Supposons qu'un attaquant fournisse l'entrée suivante

  • Étape 1: Entrez Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer JavaScript pour le visualiser. comme adresse e-mail
  • Étape 2: entrez 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 utilisateurs WHERE email = ' Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour le visualiser. ' ET mot de passe = md5 ('xxx') OU 1 = 1 -] ');

Le diagramme ci-dessous illustre la déclaration a été générée.

ICI,

  • L'instruction suppose intelligemment que le cryptage md5 est utilisé
  • Complète le guillemet simple et le crochet fermant
  • Ajoute une condition à l'instruction qui sera toujours vraie

En général, une attaque par injection SQL réussie tente un certain nombre de techniques différentes telles que celles présentées ci-dessus pour mener à bien une attaque.

Autres types d'attaques par injection SQL

Les injections SQL peuvent faire plus de mal qu'en passant simplement les algorithmes de connexion. Certaines des attaques comprennent

  • Supprimer des données
  • Mise à jour des données
  • Insérer des données
  • Exécution de commandes sur le serveur pouvant télécharger et installer des programmes malveillants tels que des chevaux de Troie
  • Exporter des 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.

La liste ci-dessus n'est pas exhaustive; cela vous donne juste une idée de ce que l'injection SQL

Outils d'automatisation pour l'injection SQL

Dans l'exemple ci-dessus, nous avons utilisé des techniques d'attaque manuelles basées sur notre vaste connaissance de SQL. Il existe des outils automatisés qui peuvent vous aider à effectuer les attaques plus efficacement et dans les plus brefs délais. Ces outils comprennent

  • SQLSmack - https://securiteam.com/tools/5GP081P75C
  • SQLPing 2 - http://www.sqlsecurity.com/downloads/sqlping2.zip?attredirects=0&d=1
  • SQLMap - http://sqlmap.org/

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.

  • L'entrée utilisateur ne doit jamais être approuvée - Elle doit toujours être nettoyée avant d'être utilisée dans des instructions SQL dynamiques.
  • Procédures stockées - elles peuvent encapsuler les instructions SQL et traiter toutes les entrées comme des paramètres.
  • Instructions préparées - 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 - elles peuvent être utilisées pour détecter un 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 aider à 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 et où exactement une erreur s'est produite. 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: utiliser 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 Web / d'une application.

Résumé

  • L'injection SQL est un type d'attaque qui exploite les 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.