Injection SQL : automatiser ses SQLi

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


Avant de commencer l’article sur sqlmap je tenais à vous rappeler qu’utiliser un logiciel de ce type sans savoir comment il fonctionne est à la fois stupide et dangereux. Je vous conseille donc vivement d’apprendre le SQL et les injections SQL manuelles.
Précédemment, je vous ai montré comment injecter du code SQL dans une URL manuellement. Nous avons vu qu’en modifiant un peu une URL, on pouvait duper le script PHP et récupérer des données.

Cependant aujourd’hui il existe de nombreux outils qui permettent de faire la même chose en tapant deux lignes sur un invite de commande. Sqlmap est l’un d’entre eux, il est disponible sous Unix, MacOs et Windows, vous pouvez le télécharger ici et c’est un projet open source (disponible ici ).

Sqlmap (tout comme Havij) est un outil automatisé d’injection SQL utilisé pour les audits de sécurité (pentest). Voici à quoi il ressemble :

accueil

La commande la plus simple à comprendre et à utiliser est la suivante :

1erec

-Le py en début de commande permet d’indiquer que l’on utilise un outil écrit en python.
-La ligne C:\Users\Aurélien… est le chemin de mon sqlmap
-Le -u indique que l’on va utiliser un URL
-La ligne http:// … est l’URL vulnérable (ici mon localhost avec la base de données utilisées dans l’article injection sql partie 2.

Voici le résultat :

rc1

En premier sqlmap va vérifier que le site est atteignable, ensuite il vérifie si le site est protégé par un IDS, un IPS ou encore un WAF. IPS (Intrusion penetration system) et IDS (intrusion prevention system) sont des systèmes de protection empêchant ou limitant les attaques de pirates. Un WAF (web application firewall) est un pare feu pour Internet.

En somme les trois systèmes permettent de détecter un trafic anormal sur la cible.
Par la suite sqlmap va tester si le paramètre GET « idCategory » est vulnérable.
La dernière ligne est très importante, en effet sqlmap nous dit qu’il « semblerait que la base soit administrée par Mysql ». Et c’est vrai. Il va donc nous demander si l’on souhaite quand même tester les injections pour les autres SGBD. Dans notre cas nous savons que notre SGBD est MySql. On lui dira donc non.

Voilà la suite :

suite-rq1

On remarque que sqlmap utilise la close order by afin de trouver le bon nombre de colonne (tout comme nous l’avons fait manuellement). Il nous répond ensuite qu’il y a 3 colonnes dans la requête. Ce qui est encore une fois vrai. Puis il test une requête du type UNION (encore une fois comme nous manuellement) et nous indique que le paramètre idCategory est vulnérable.
(La dernière ligne nous importe peu, nous savons que idCategory est vulnérable par conséquent nous allons nous focaliser sur celui-ci).

Sqlmap va par la suite effectuer plusieurs tests afin de déterminer si l’URL est injectable ou non :

difmet

La première ligne nous indique que sqlmap a lancé 44 requêtes http. Ça peut paraître anodin mais le nombre de requête est quand même très important notamment si ce que vous faites n’est pas très légal. En effet une activité trop important peut permettre à une personne qualifiée de comprendre qu’une attaque est en cours.

Le bloc suivant est en fait l’ensemble des méthodes qui ont permis à sqlmap de déterminer si l’URL est vulnérable.
Boolean Bases Blind : sqlmap insère un booléen vrai (ici 2871=2871) et regarde si la page à changer. Si la page n’est pas modifiée alors l’URL est injectable, sinon non.

Error Based : sqlmap va former une URL volontairement invalide et va regarder si un message d’erreur est renvoyé par le serveur. Si oui alors l’URL est non injectable, sinon il l’est.

And/Or time based blind : sqlmap ajoute à l’URL la clause « SLEEP(5) » qui va ralentir le traitement de la requête par le SGBD. Si le traitement de la requête est affecté alors l’URL est injectable sinon non.

Union Query : sqlmap va simplement crée une requête de type union et observé le résultat.

Il existe une dernière méthode de détection qui n’est pas utilisée ici, c’est la technique du Stack queries. Sqlmap va modifier l’URL en ajoutant un « ; » à la fin de la première requête puis une seconde requête :

localhost/test/injectionsql/formulaire.php?idCategory=2 ; SELECT..

Si l’une de ces requêtes a été validé alors on considère que le lien est injectable.

La dernière ligne (en vert) nous indique que toutes les données trouvées ont été placé dans le fichier situé à cet emplacement : C:\Users\Aurélien\.sqlmap\output\localhost

dossier

Dans ce fichier nous avons toutes les bases de mon SGBD, ainsi que leur contenu présenté dans des fichiers excel :

resu

Notre injection via sqlmap est donc un succès !


Quelques informations supplémentaires :

Framework Symfony :

Il est important de savoir que si le site a été créé sous le framework Symfony alors vous ne pourrez pas utiliser d’injections SQL. En effet Symfony, par défaut, sécurise tous les champs. Des attaques de type XSS ou SQL sont donc impossible.

URL Rewrite :

Généralement un URL ressemble à ça :

localhost/test/injectionsql/formulaire.php?idCategory=2

Mais certains sites « rewrite » leurs URL afin de les rendre plus esthétiques et plus lisibles. Ainsi notre URL pourra être réécrite ainsi :

localhost/test/injectionsql/formulaire/idCategory/2

On se doute que le paramètre vulnérable est idCategory mais comment le faire comprendre à sqlmap ? Eh bien tout simplement en ajoutant un « * » au niveau de la valeur du paramètre.
L’URL à transmettre à sqlmap sera donc :

localhost/test/injectionsql/formulaire/idCategory/2*



Les commandes en plus

La commande -h vous indique l’ensemble des options possibles, voici les options les plus intéressantes :

version

Elle permet d’afficher la version du SGBD. (Dans tous les tests d’intrusion, connaître la version d’un logiciel est d’une grande utilité !)
C’est même la base d’un pentest réussi. En effet si vous connaissez la version du logiciel utilisé vous trouverez facilement un exploit permettant d’attaquer votre cible

datacookie

–data=DATA : nous permet d’indiquer quelle valeur on veut envoyer via la méthode POST d’un formulaire.

Exemple : –data= »login=unlogin&motdepasse=unmotdepasse »

–cookie=COOKIE : utilise la valeur d’un cookie (pour rappel un cookie est un petit fichier texte qui permet de stocker des informations telles que des mots de passe ou des identifiants. Typiquement on utilise des cookies lorsque l’on se connecte sur Facebook et qu’au lieu d’avoir le formulaire de connexion on est logué automatiquement sur notre compte. Facebook va aller chercher votre identifiant ainsi que votre mot de passe dans ce petit fichier et directement vous connecter à votre compte.

–proxy=PROXY : vous connecte à un proxy avant de procéder à l’attaque. Un proxy est un composant logiciel informatique qui se place entre vous et le serveur que vous attaquez. C’est un bon moyen de protection puisque c’est l’adresse IP du proxy qui sera utilisée pour l’attaque.

–tor et –check-tor : vous permettent de vous connecter au réseau tor et de vous anonymiser.
(Si vous voulez plus d’informations sur le réseau TOR, je vous conseille d’aller ici, c’est un projet fait dans le cadre de mes études qui date un peu mais qui reste à 90% vrai.)

dumpall

Toutes ces options vous permettent de récupérer des données précises ou bien des tables, colonnes, schémas. L’option –dump-all récupère le contenu de chaque base de données.

osa

Ces dernières options sont beaucoup plus fun à utiliser mais ne fonctionnent pas tout le temps.

–os-shell : implémente une backdoor en utilisant la base de données (cela n’est possible que si l’utilisateur possède les bons privilèges.). Cela permet d’exécuter des commandes directement sur l’équipement qui gère la base de données.

–os-pwn : ouvre une session meterpreter. J’en parlerai dans un autre article.

–sqlmap-shell : ouvre une interface shell permettant d’entrer des commandes qui seront directement envoyées vers la base. A l’aide de ce shell on va pouvoir récupérer des données en utilisant des requêtes de types select mais on va aussi pouvoir… se créer un compte administrateur par exemple !
Cette option est clairement ultra importante ! Malheureusement elle n’est utilisable que si la méthode Stacked queries est utilisable.


Les mots de passe :

Très souvent les mots de passe stockés dans les bases de données sont cryptés ou hashés. Résultat un mot de passe qui à la base était : « motdepasse » va être transformé en ceci : « e543fdb4737f66b96e764d7303a15ae8 ».

Sqlmap reconnait les fonctions de cryptage MD5, SHA-1 et toutes les fonctions propres aux différents SGBD. Il vous propose, par défaut, de les décrypter s’il en repère.

Dernier point, sqlmap autorise les attaques via les google docks. Un google dock est une méthode qui permet d’utiliser le moteur de recherche google afin de rechercher des informations sensibles concernant une cible. Concrètement nous allons utiliser google afin de récupérer des informations qui nous permettront par la suite de lancer des attaques ciblées.

Je ne m’y connais pas assez sur le sujet pour vous en parler, par conséquent je vous laisse ce lien qui explique clairement comment tout ceci fonctionne.


Et voilà, j’ai plus ou moins fait le tour de l’outil sqlmap, comme vous avez pu le voir il est extrêmement puissant. Le plus dangereux reste quand même l’accès au cmd sur le matériel qui gère la base de données.
Tout ça pour vous dire de protéger vos bases de données et surtout les scripts PHP utilisés.
Je vous rappelle encore une fois que l’injection SQL est illégale et est punie, ne faites pas n’importe quoi avec.

Si vous avez des questions n’hésitez pas à me les poser dans la section « Contact » !

3 commentaires

  1. très intéressant, mais comme tu la dis au début du tuto c’est un tool qui attire beaucoup plus les script kiddies ^^ ils aiment tout ce qui est suspicieux lol.
    Autre chose, je pense que SQLmap n’est pas assez pertinent, vaux mieux bidouiller manuellement.
    MERCI.

    Aimé par 1 personne

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