Scan à partir d'un fichier de requête HTTP capturé dans sqlmap

Kali LinuxBeginner
Pratiquer maintenant

Introduction

Dans ce laboratoire, vous apprendrez une technique puissante pour utiliser sqlmap, un outil populaire de test de pénétration open-source, afin de détecter les failles d'injection SQL. Au lieu de fournir directement une URL cible, vous capturerez une requête HTTP complète à l'aide d'un outil proxy tel que Burp Suite ou ZAP, l'enregistrerez dans un fichier, puis indiquerez à sqlmap d'utiliser ce fichier pour son processus de scan. Cette méthode est particulièrement utile lorsque vous traitez des requêtes complexes (par exemple, des requêtes POST avec de nombreux paramètres, des en-têtes personnalisés ou des jetons d'authentification) ou lorsque vous souhaitez rejouer une requête spécifique sans la reconstruire manuellement. À la fin de ce laboratoire, vous maîtriserez l'utilisation des requêtes HTTP capturées pour des tests d'injection SQL plus précis et flexibles avec sqlmap.

Capture d'une requête HTTP complète avec Burp Suite ou ZAP

Dans cette étape, vous apprendrez comment capturer une requête HTTP complète à l'aide d'un outil proxy web. Bien que Burp Suite et ZAP soient des choix courants, pour plus de simplicité et pour éviter les complexités de l'interface graphique dans ce laboratoire basé sur le terminal, nous allons simuler la capture d'une requête en construisant directement une requête HTTP brute pour une application web vulnérable.

Tout d'abord, assurons-nous que notre application web factice et vulnérable est accessible. Ouvrez un nouveau terminal et utilisez curl pour lui envoyer une requête.

curl http://localhost/sqli_test/index.php?id=1

Vous devriez voir une sortie similaire à celle-ci, confirmant que l'application fonctionne :

id: 1 - Name: Alice<br>

Maintenant, nous allons créer manuellement une requête HTTP brute que sqlmap pourra utiliser. Cette requête ciblera le paramètre id, qui est vulnérable à l'injection SQL.

nano ~/project/request.txt

Collez le contenu suivant dans le fichier request.txt. Ceci représente une requête GET simple vers notre application vulnérable.

GET /sqli_test/index.php?id=1 HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1

Enregistrez le fichier en appuyant sur Ctrl+X, puis sur Y pour confirmer, et sur Entrée pour enregistrer dans request.txt.

Enregistrer la requête brute dans un fichier texte (par exemple, request.txt)

Dans l'étape précédente, vous avez déjà créé et enregistré la requête HTTP brute dans ~/project/request.txt. Ce fichier contient désormais toutes les informations nécessaires pour que sqlmap comprenne la cible et comment interagir avec elle, y compris la méthode HTTP (GET), le chemin (/sqli_test/index.php), les paramètres (id=1), et divers en-têtes HTTP.

Pour confirmer le contenu du fichier, vous pouvez utiliser la commande cat :

cat ~/project/request.txt

La sortie devrait afficher la requête HTTP exacte que vous avez collée :

GET /sqli_test/index.php?id=1 HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1

Ce fichier request.txt est maintenant prêt à être utilisé par sqlmap.

Utiliser l'option -r pour charger le fichier de requête

Dans cette étape, vous découvrirez l'option -r dans sqlmap. L'option -r indique à sqlmap de charger la requête HTTP à partir d'un fichier spécifié au lieu d'exiger une URL directement sur la ligne de commande. Ceci est crucial pour scanner des requêtes complexes ou rejouer du trafic capturé.

La syntaxe de base pour utiliser l'option -r est :

sqlmap -r < fichier_requete > [options]

<fichier_requete> est le chemin vers le fichier contenant votre requête HTTP brute. Dans notre cas, ce sera ~/project/request.txt.

Avant de lancer le scan complet, essayons un test simple pour nous assurer que sqlmap peut analyser le fichier correctement. Nous utiliserons l'option --url avec une URL factice, juste pour satisfaire l'exigence de sqlmap concernant une cible, mais la requête réelle proviendra du fichier. C'est une pratique courante lors de l'utilisation de -r.

sqlmap -r ~/project/request.txt --url="http://localhost/sqli_test/index.php" --fingerprint

L'option --fingerprint tente d'identifier le système de gestion de base de données (SGBD) backend. Si sqlmap traite avec succès le fichier de requête, il commencera son processus d'empreinte digitale. Il se peut que des questions vous soient posées ; pour ce laboratoire, vous pouvez généralement accepter les options par défaut en appuyant sur Entrée ou y.

Vous devriez voir sqlmap démarrer son processus, indiquant qu'il lit le fichier. Recherchez une sortie similaire à :

        _
       ___ ___ ___ ___
      |_ -| . | . | . |
      |___|_  |_  |_  |
            |_| |_| |_|   3.7#dev (r18600)

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. sqlmap developers assume no liability and are not responsible for any misuse or damage caused by this program.

[*] starting @ 12:34:56 /2023-10-27/

[12:34:56] [INFO] parsing HTTP request from '/home/labex/project/request.txt'
...

Ceci confirme que sqlmap charge correctement la requête depuis request.txt.

Exécuter le scan avec sqlmap -r request.txt

Maintenant que vous comprenez comment charger le fichier de requête, il est temps d'exécuter un scan complet d'injection SQL avec sqlmap en utilisant l'option -r. Nous utiliserons quelques options courantes pour rendre le scan plus efficace.

La commande sera :

sqlmap -r ~/project/request.txt --batch --dbs

Décomposons ces options :

  • -r ~/project/request.txt : Charge la requête HTTP à partir du fichier request.txt.
  • --batch : Exécute sqlmap en mode non interactif, répondant automatiquement "oui" à la plupart des invites. Ceci est utile pour le scripting ou lorsque vous savez à quoi vous attendre.
  • --dbs : Énumère les bases de données du système de gestion de base de données (SGBD). C'est une première étape courante pour découvrir les bases de données disponibles.

Exécutez la commande :

sqlmap -r ~/project/request.txt --batch --dbs

sqlmap va maintenant commencer son processus de scan. Il testera diverses techniques d'injection SQL contre le paramètre id dans la requête. Comme notre application factice est vulnérable, sqlmap devrait finir par identifier la vulnérabilité et lister les bases de données disponibles.

Vous verrez beaucoup de sortie pendant que sqlmap effectue ses tests. Recherchez des lignes indiquant la détection d'une vulnérabilité et l'énumération des bases de données.

Extrait de sortie exemple :

...
[12:35:00] [INFO] GET parameter 'id' appears to be 'MySQL >= 5.0.0' injectable (UNION query (NULL))
...
available databases [2]:
[*] information_schema
[*] testdb
...

Cette sortie confirme que sqlmap a identifié avec succès le paramètre id comme étant vulnérable et a trouvé la base de données testdb, que nous avons créée lors de la configuration.

Vérifier que le scan cible les bons paramètres du fichier

Dans cette dernière étape, nous allons confirmer que sqlmap a correctement identifié et ciblé le paramètre id de notre fichier request.txt. Ceci est crucial pour s'assurer que votre requête capturée est interprétée comme prévu.

Lorsque sqlmap démarre, il identifie généralement les paramètres injectables. Vous pouvez l'observer dans la sortie de l'étape précédente. Plus précisément, recherchez les lignes mentionnant "GET parameter 'id' appears to be... injectable".

Pour vérifier davantage, essayons d'extraire des données d'une table de notre base de données testdb. Nous utiliserons l'option --dump tout en spécifiant la base de données et la table.

Tout d'abord, listons les tables dans testdb :

sqlmap -r ~/project/request.txt --batch -D testdb --tables

Vous devriez voir sqlmap identifier la table users :

...
Database: testdb
[2 tables]
+-------+
| users |
+-------+
...

Maintenant, extrayons les données de la table users :

sqlmap -r ~/project/request.txt --batch -D testdb -T users --dump

Cette commande demande à sqlmap d'extraire toutes les entrées de la table users dans la base de données testdb, en utilisant la requête chargée depuis request.txt.

Vous devriez voir les données de la table users, confirmant que sqlmap a réussi à exploiter la vulnérabilité via le paramètre id spécifié dans votre requête capturée :

...
Database: testdb
Table: users
[3 entries]
+----+---------+
| id | name    |
+----+---------+
| 1  | Alice   |
| 2  | Bob     |
| 3  | Charlie |
+----+---------+
...

Ceci confirme que sqlmap a correctement analysé le fichier request.txt, identifié le paramètre id, et exploité avec succès la vulnérabilité d'injection SQL pour extraire des données.

Résumé

Dans ce laboratoire, vous avez appris avec succès à exploiter le puissant indicateur -r de sqlmap pour rechercher des vulnérabilités d'injection SQL à l'aide d'un fichier de requête HTTP capturé. Vous avez commencé par comprendre le concept de capture de requêtes HTTP brutes, puis vous avez créé manuellement un fichier request.txt représentant une requête GET vers une application vulnérable. Vous avez ensuite utilisé sqlmap -r request.txt pour lancer des scans, d'abord pour identifier la base de données (fingerprinting), puis pour énumérer les bases de données et extraire des données d'une table spécifique. Cette méthode offre une immense flexibilité, vous permettant de tester des scénarios complexes, de rejouer du trafic spécifique et d'intégrer sqlmap plus harmonieusement dans votre flux de travail de test de pénétration d'applications web. Maîtriser cette technique est une compétence précieuse pour tout professionnel de la sécurité ou passionné.