Utiliser SQLMap pour réaliser des injections SQL (GET)

Illustration SQL

SQLMap est un outil extrêmement puissant : il permet de réaliser des injections SQL complexes en une seule ligne de commande, de manière automatisée. Voyons en détail de quoi il s’agit.

Qu’est-ce que SQL Map ?

SQLMap est un outil qui permet de découvrir si une cible est vulnérable aux injections SQL, puis de l’exploiter si c’est possible. Cet outil est fourni nativement dans la suite de sécurité Kali linux. Il supporte les langages SQL les plus courants, MySQL, PostgreSQL, SQL Server, Oracle, … mais aussi plusieurs dizaines de langages moins utilisés. SQL Map effectue plusieurs types d’injection SQL et est capable de récupérer (dump) la base de données et de s’attaquer aux utilisateurs de la base. Ainsi, il est également possible de l’utiliser pour de l’élévation de privilège en l’utilisant conjointement avec metasploit.

Le projet et la documentation complète (en anglais) sont disponibles sur le Github officiel https://github.com/sqlmapproject/sqlmap.

Qu’est-ce qu’une injection SQL

Une injection SQL est une faille de sécurité qui permet d’exécuter des requêtes SQL modifiées via un site web ou une application vulnérable. Par exemple, votre site de news préféré va chercher le contenu de l’article sur lequel vous venez de cliquer dans sa base de données. Si le site est vulnérable, il est alors possible de modifier la requête qui va chercher le contenu de l’article pour récupérer la liste des utilisateurs inscrits sur le site. A partir de là, on peut récupérer par exemple le numéro de carte bleue des utilisateurs.

Heureusement pour nous, utilisateurs, cela n’est pas si simple, car d’autres sécurités comme le hash, protègent les informations sensibles au sein même des bases de données. De plus, cette faille est très connue, et de moins en moins de sites y sont vulnérables, comme le montre le rapport de l’owasp, qui répertorie les attaques perpétrées. Les injections SQL passent à la 3ème place en 2021.

Mapping of the relationship between the Top 10 2017 and the new Top 10 2021
Source : https://owasp.org/Top10/

Principe technique d’une injection SQL

Le principe est d’injecter du code SQL dans une recherche SQL déjà présente sur le site, pour obtenir d’autres informations que celle initialement prévu.

Prenons cette page qui affiche les informations d’un utilisateur (tiré de DVWA, une machine virtuelle volontairement vulnérable pour tester les failles).

Si l’on renseigne dans le champ l’id d’un utilisateur, une requête SQL contenant l’ID est fabriquée et exécutée. Le code devrait ressembler à ceci

$query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";

Ce qui donne la requête SQL suivante, une fois complété des informations que l’on a saisi

SELECT first_name, last_name FROM users WHERE user_id = '1';

Si la requête est codée de cette manière, alors il est possible, au lieu de renseigner « 1 », de modifier la requête pour afficher des informations supplémentaires. L’objectif est d’exécuter cette requête, pour afficher toutes les lignes

SELECT first_name, last_name FROM users WHERE user_id = '' or 1=1

Nous avons simplement clôturé l’indication de l’id avec un , puis nous avons rajouté une condition qui est toujours vraie pour afficher toutes les lignes or 1=1 .

Mais cela va nous renvoyer une erreur, car il reste à la fin de la requête un qui se balade tout seul.

SELECT first_name, last_name FROM users WHERE user_id = '' or 1=1 ';

Pour ne pas que le moteur SQL ne le prenne en compte, il faut le mettre en commentaire. En MySQL, le moteur SQL le plus commun sur le web, le commentaire se détermine avec un #. Ainsi, nous allons rajouter à la fin de notre saisie un # pour que le moteur SQL ignore la fin de la requête.

SELECT first_name, last_name FROM users WHERE user_id = '' or 1=1 # ';

Dans notre formulaire, nous allons donc devoir saisir ‘ or 1=1 #, et effectivement, toutes les lignes s’affichent.

De la même manière, en utilisant du code SQL plus poussé, il est possible d’afficher ce que l’on veut dans la base de données : les mots de passe, les coordonnées, voir les CB de ses utilisateurs s’ils sont mal protégés.

Utilisation de SQLMap pour une injection URL (GET)

L’injection SQL est un processus qui peut s’avérer particulièrement long s’il est fait à la main et cela requiert une connaissance poussée du SQL. Heureusement pour nous, des personnes nous ont mâché le travail en inventant SQLMap.

Le plus simple est quand le paramètre se situe dans l’URL. Si c’est le cas, le lien aura cette forme.

http://siteatester.fr?id=1

Note : Pour une authentification par exemple, les paramètres sont généralement passés par la méthode POST, qui est invisible dans l’URL. Nous verrons dans un prochain article la procédure, qui est un peu plus complexe dans le cas d’une injection via POST.

Revenons à notre GET. Si la requête utilise cette méthode, il suffit alors d’indiquer à SQLMap l’URL et le reste est automatique.

sqlmap -u "http://siteatester.fr?id=1" --dump

Cette commande suffit pour récupérer (dump) toutes les tables de la base de données. L’outil a récupéré le contenu de la table des commentaires

De plus, il a également trouvé celles des utilisateurs. Enfin, un module est également prévu pour cracker les hashs communs des mots de passe.

En quelques dizaines de secondes, j’ai donc une copie de la base de données et toutes les informations sensibles sur mon poste, d’où la puissance d’SQLMap.

Toutes les commandes utiles SQLMAP sont disponibles dans notre Sheet cheat SQLMAP.

Posted by
FrenchEagle

Créateur de hackntricks

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.

4 × un =