Comment fonctionne l'attaque par injection SQL

Table des matières

Si nous énumérons les vulnérabilités des applications Web qui ont eu le plus d'impact en raison du degré de gravité qu'elles peuvent causer, nous trouverons sans aucun doute le Injection SQL. Ce vulnérabilité il peut même permettre à l'attaquant de passer de la liste du contenu de la base de données à l'accès complet au serveurVoyons en quoi il consiste.

Le terme injection, fait référence à l'injection ou à l'ajout d'instructions SQL dans une requête que l'application exécute dans la base de données, ceci est effectué en profitant de toute entrée de données que l'application demande directement ou indirectement à l'utilisateur, nous nous référons directement à des champs, par exemple des formulaires lorsque l'utilisateur saisit certaines données, il peut s'agir indirectement de paramètres transmis via URL (GET). L'objectif d'injecter des instructions SQL dans la requête est de modifier la logique de ladite requête ou le résultat qui sera renvoyé par la base de données.

Il s'agit d'un formulaire typique où un nom d'utilisateur et un mot de passe sont demandés pour accéder à un espace privé. Le code côté serveur qui forme la requête ressemblerait à ceci :

 $ nom d'utilisateur = $ _POST ['nom d'utilisateur']; $ mot de passe = $ _POST ['mot de passe']; $ sql = "SELECT * FROM utilisateurs WHERE nom d'utilisateur = '$ nom d'utilisateur' AND mot de passe = '$ mot de passe'"; 
Comme on peut le voir, d'abord le nom d'utilisateur et le mot de passe saisis dans les variables nom d'utilisateur et mot de passe sont stockés respectivement, puis ces valeurs sont incluses dans la requête qui sera envoyée à la base de données pour vérifier si ledit utilisateur existe. Supposons que dans notre exemple l'utilisateur entre comme nom d'utilisateur admin et mot de passe passer123, lors de l'envoi du formulaire, la requête formée sera la suivante :
 SELECT * FROM utilisateurs WHERE nom d'utilisateur = 'admin' AND mot de passe = 'pass123'
Comme nous pouvons le voir, lorsque les données d'entrée sont placées, elles sont entre les guillemets simples pour représenter qu'il s'agit d'une chaîne de texte. Cette requête sera envoyée à la base de données et renverra un résultat avec les données dudit utilisateur, si elle existe, et l'accès à l'espace privé sera autorisé, sinon elle renverra un résultat vide et l'accès sera refusé.

Comme nous l'avons mentionné précédemment, injection SQL Il consiste à ajouter du code SQL à une requête, et ce formulaire le permet à travers les champs de saisie, de sorte que nous ayons une application vulnérable à l'injection SQL.

Exploiter la vulnérabilité
L'objectif de l'exploitation de cette vulnérabilité est d'accéder à l'espace privé sans connaître le nom d'utilisateur ou le mot de passe correct, et d'exploiter la vulnérabilité. Nous devons donc injecter du code SQL pour former une requête qui renvoie un résultat valide.

Voyons comment se forme la requête si on injecte le code SQL suivant dans le champ mot de passe :

Lorsque la requête est formée, elle sera la suivante :

 SELECT * FROM utilisateurs WHERE nom d'utilisateur = 'hacker' AND mot de passe = '' ou 1 = 1 # '
Une attention importante doit être accordée au fait que le code inséré est entre les guillemets simples qui entourent le mot de passe, le guillemet simple au début du code inséré est responsable de compléter le guillemet ouvert dans le mot de passe = 'partie du requête, on obtient ainsi temporairement la requête suivante :
 SELECT * FROM utilisateurs WHERE nom d'utilisateur = 'hacker' AND mot de passe = ''
Cette requête pour le moment ne renverra pas de résultats car il n'y a pas d'utilisateur avec ces informations d'identification, mais analysons le reste du code inséré :
 ou 1 = 1 #
Phrase ou 1 = 1 change radicalement la logique de la requête, puisque comme on le sait dans une requête formée par le conditionnel OU ALORS Il retournera vrai lorsqu'au moins une des deux expressions est remplie, dans notre cas la première expression est nom d'utilisateur = 'hacker' ET mot de passe = '' , et le deuxième ou 1 = 1 , ce dernier est toujours vrai, c'est-à-dire que 1 est toujours égal à 1, car la requête renverra un résultat valide.

Enfin, nous devons nous débarrasser du guillemet qui ferme la phrase, pour cela, nous pouvons utiliser les commentaires utilisés dans SQL : #, - (double tiret), ou bien /* */ . donc la requête complète est :

 SELECT * FROM utilisateurs WHERE nom d'utilisateur = 'hacker' AND mot de passe = '' ou 1 = 1 # '
Tout ce qui suit le # sera pris en compte en tant que commentaire et ne fera pas partie de la requête.

Pour obtenir un résultat valide, il existe de nombreuses autres variantes du code que nous pouvons insérer, par exemple :

wave wave wave wave wave