Stack Based injection

Dans l’article précédent nous avons vu qu’il est possible de bypass un formulaire assez aisément. Mais on peut faire encore pire ! Imaginez la situation suivante, vous avez réussi à bypass le formulaire d’authentification mais vous avez peur que le développeur patch cette faille rapidement. Du coup on aimerait bien avoir un accès à vie dans l’application.

Comment faire ? Idéalement on aimerait bien déposer une backdoor sur le serveur mais là ce n’est pas possible. Par contre on sait qu’il y a une faille SQLi donc on pourrait peut être ajouter du code SQL pour créer un nouvel utilisateur ?…

Pour cet article nous on aura besoin de quelques fichiers. Vous les trouverez ici.

I/Exploitation de la stack based SQLi

Créons une nouvelle base de données dans laquelle nous aurons une seul table « user » et dans laquelle on aura un champ iduser, username, et password :

user.png

Dans cette base de données on va ajouter un seul utilisateur : l’admin :

insert.png

Maintenant on monte un petit formulaire et un fichier de traitement php sur notre serveur apache :

Le formulaire :

form.png

Le fichier de traitement.php :

11.png

Bueno ! Donc si on entre les identifiants admin/admin :

adminadmin.png

On va être identifié en tant qu’admin :

bienvenue

Ici on ne va pas s’amuser à bypass le formulaire mais on va créer un nouvel utilisateur dans la base. Comment ? Reprenons la requête SQL de base :

SELECT * FROM user WHERE username='$id' AND password='$pass';

Si on entre admin/admin la requête sera transformée en :

SELECT * FROM user WHERE username='admin' AND password='admin';

Si on entre admin’ ; — comme username alors la requête ressemblera à ça :

SELECT * FROM user WHERE username='admin';

Comme je vous l’ai dit dans l’article précédant, les « — » indique le début d’un commentaire. Donc dans ce cas ci la partie password= »$password »; est tout simplement supprimée.

L’intérêt de l’injection Stack Based c’est qu’on va pouvoir écrire une nouvelle requête SQL par dessus la première. Donc on peut ajouter ce qu’on veut… Un INSERT par exemple. 😏😏

Du coup si pour le username on entre :

 admin' ; INSERT INTO user (username, password) VALUES ("backdoor","backdoor") ;

eh bien visuellement on verra ceci :

bienvenue

Mais derrière dans la base de données on aura ceci :

backdoored.png

Oops… Maintenant on peut se connecter avec notre compte backdoor/backdoor :

powned.png

GG WP ! 😁😁

II/ Bloquer le stack based

Même réponse que dans l’article précédant, il suffit d’utiliser les requêtes préparées. Au lieu d’insérer directement les inputs de l’utilisateur dans la requête :

nonprepared.png

On aurait ça :

prepared.png

Si vous voulez aller plus loin vous pouvez aussi empêcher l’utilisation des caractères spéciaux tels que ‘, « , (, ) mais n’oubliez pas que l’on peut bypass ce genre de filtre 😉 ! D’ailleurs je ferai un article où je vous montrerai comment sécuriser au maximum les inputs des utilisateurs. Mais avant ça je vous invite à lire la suite de cette série d’article sur les SQLi ici 😋 !

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