SQLMAP
Atualizando
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
Listando os Databases
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
.
Listando as Tabelas
Do database atual
Retorna as tabelas de todos os databases
Visualizando a estrutura de todas as tabelas do database atual
Listando as Colunas de uma Tabela
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>
.
Caso queira trazer determinados registros da tabela, por exemplo, do 2º registro até o 5º, utilize o seguinte comando:
Definindo qual Parâmetro deve ser Testado
Verificando o Database Atual
Verifica em qual database a aplicação web está conectada no momento
Verificando o User Atual
Verifica qual o user que a aplicação web está utilizando no momento
Pegando Versões do Banco de Dados, SO e Apache / NGNIX
Verifica o banner do Bando de Dados, e a versão do :
Verificando se o User Atual é DBA
DBA é um usuário com permissões especiais
Retornando Todos os Users do Banco de Dados
Definindo a Quantidade de Colunas no Union
Só utilize esse parâmetro quando realmente souber quantas colunas devem ser enviadas no Union
Por padrão o sqlmap utiliza NULL nos valores do Union, então podemos alterar esse valor da seguinte forma
Otimizando Scanners
Ativa todas as opções de otimização
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
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
Utilizando Condições WHERE
Lendo Arquivos do Servidor
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
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
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
Hashes de Usuários MySQL
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
Upload de Arquivos
Prefixo e Sufixo
As vezes precisamos que nosso payload tenha determinado prefixo e/ou sufixo.
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
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
Trabalhando com Cookies
Definindo Payload como Verdadeiro
Determinada string na resposta de requisição
Valida status 200 HTTP como um payload com sucesso
Valida o payload a partir do do HTML
Executando Comandos no Shell
Usando Threads
Usando Proxy
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
Utilizando TOR nas requisições
WAF
Utilize o parâmetro --identify-waf
, que e o substituto do --check-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:
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.
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:
Verbose
O modo verbose vai de 0 a 6 (o padrão é 1), sendo 0 (zero) o mais discreto e 6 o mais detalhado
Caso for utilizar verbose em um nível, pode-se remover as "sujeiras" das respostas das páginas web.
Out-of-band SQL Injection
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
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)
Para definir determinadas respostas para determinadas perguntas, utilize:
OBS.: Em answers
, utilize como parâmetro, alguma palavra da pergunta
Injections em Formulários (POST)
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
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
O SqlMap irá inserir o payload no lugar do *
Método HTTP
Personalizando Headers
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:
Agora podemos utilizar o comando
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
Tamper
INFO: Todos os scripts tamper ficam em /usr/share/sqlmap/tamper
.
Listando todos os tampers disponíveis e suas descrições.
Convertendo o payload em charunicode
Convertendo o payload em Hex e em Base64
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:
Neste exemplo, será executado todas as 5 técnicas (que é o default do SQLMAP), pois indica a inicial de todos os ataques.
Sites
Last updated