Bypass de formulaires

To the non-french speaker, note that you can translate the articles using the Google Trad widget situated at the bottom of all pages.


L’injection SQL (ou SQLi) est une attaque dont le but est d’utiliser l’inattention des développeurs web afin d’exploiter une base de données. Les failles SQLi reposent bien évidemment sur la langage SQL, il est donc nécessaire de connaître les rudiments de celui-ci. Et ça tombe bien car vous trouverez un article sur le langage SQL ici ! 😉

I/ Exploitation d’une SQLi

Imaginez que vous voulez vous connecter sur un forum, vous allez avoir un formulaire ressemblant plus ou moins à ça :

form

Et voici le code HTML correspondant :

code

Ainsi que la base de données utilisée :

bdd.png

Comme vous pouvez le voir les informations du formulaire vont être transmises via la méthode POST (on aurait pu faire de même avec la méthode GET). Si vous ne voyez pas du tout de quoi je parle, je vous conseille d’apprendre le PHP 😀 ! Sachez que POST et GET sont deux méthodes permettant l’envoi de données via des formulaires.

Le fichier « traitement.php » va donc recevoir deux informations, l’id et le mdp que vous avez entré dans le formulaire.

Voici le code du fichier traitement.php :

code.png

Ici les données sont récupérées sans être vérifiées et directement intégrées à la requête SQL. Et c’est là qu’est l’erreur !

Ce code récupère les id et mdp de l’utilisateur et lui renvoie les informations nom, prénom, mail et adresse le concernant. Donc si j’entre id=admin et mdp=motdepassedelamort j’obtiens :

bienvenue.png

Que se passerait-il si je décidais d’entrer du code SQL dans le formulaire ? Et bien je pourrais par exemple me logger en tant qu’administrateur sans avoir les id et mdp ! En effet si j’entre comme identifiant :

admin'; --

Et comme mot de passe :

whiteflagcestlfeu

bypass1.png

Je vais atterrir sur l’espace administrateur :

bienvenue

Pourquoi est ce que ça fonctionne ? Personnellement quand je fais de l’injection SQL (pour des CTf’s) j’écris toujours la requête envoyée par l’application sur un bout de papier histoire de la visualiser. Dans notre cas la requête est :

SELECT * FROM users WHERE id='$id' AND pass='$mdp' ;

En utilisant les inputs précédemment vus, notre requête ressemblera à ça :

SELECT * FROM users WHERE id='admin' ; -- pass='whiteflagcestlfeu';

Avec cette requête, on demande au SGBD de voir s’il existe un utilisateur dont l’identifiant est ‘admin’. En ajoutant les caractères « — » on va commenter le reste de la requête et donc totalement bypass la partie vérification du mot de passe. Tout ce qui se trouve après les « — » est ignoré par le SGBD !

Concrètement la requête finale qui sera exécutée est :

SELECT * FROM users WHERE id='admin' ;

Ici on a donc pu bypass le formulaire d’authentification et se connecter au compte admin !

Oui mais voilà, on a eu de la chance que l’id admin soit présent dans la base. Comment aurait-on fait si on ne l’avait pas eu ? Eh bien voici la solution :

bypass2

Et le résultat :

bienvenue2.png

Pourquoi ça marche ? Tout simplement parce que dans ce cas là, nous n’avons pas spécifié d’id en particulier mais nous avons fait en sorte que le résultat de la requête soit toujours vrai (à l’aide du « 1=1 ») :

SELECT * FROM users WHERE '' or 1=1 ; --

Comme la requête est toujours vraie, le SGBD va nous authentifier 🙂 !

II/ Se protéger contre les SQLi

La solution la plus simple est d’utiliser des requêtes préparées en PDO. Au lieu d’avoir ce type de requête :

foireuse

Nous aurons ceci :

prep

Ainsi les données envoyées par l’utilisateur seront prises en paramètre dans la requête et les injections SQL ne seront plus possible.

Je vous rappelle que l’utilisation de ces failles de manière frauduleuse est illégale. Ne faites pas n’importe quoi. Si vous voulez vous entraîner je vous laisse les fichiers de tests contenant le formulaire HTML, le fichier traitement.php et un export de la base de données.

2 commentaires

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l'aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s