Laboratório - SQL Injection
Saudações!
Nesse artigo eu irei relatar minha experiência com dois laboratórios da plataforma PortSwigger: SQL injection attack, querying the database type and version on Oracle e SQL injection attack, querying the database type and version on MySQL and Microsoft .
A função aqui é mais documentar o que eu aprendi e fixar na minha memoria. A função dele não é ser um passo a passo detalhado, está mais para um caminho ou para um monte de dicas.
Lembrando que testar aplicaçõe sem a devida permissão é crime. Não interessa se você quer fazer uma boa ação, continua errado. Como diria Alan Grant:
"As piores coisas que se podem imaginar foram feitas com as melhores intenções"
Primeiro vamos resumir o que é o SQL Injection. SQLI é uma vulnerabilidade no banco de dados das aplicações web que permitem o atacante acessar, modificar ou deletar informações de outros usuários bem como usernames, emails e senhas e etc. Essas vulnerabilidades são normalmente encontradas nos inputs do usuário ou em filtros.
Para realizar esses dois laboratórios vamos precisar de uma ferramenta chamada Burp Suite, essa ferramenta permite interceptar, modificar e automatizar requisições. Caso você tenha o Kali Linux, é uma ferramenta nativa.
Oracle
Observando a aplicação podemos ver que temos algumas categorias pré-definidas e ao clicar nessas categorias o conteúdo da página muda de acordo. Agora podemos fazer o seguinte: no burp ligamos o proxy para interceptar o trafégo e então voltamos para o navegador e clicamos em qualquer filtro para que o GET chegue até o burp. Eu recomendo enviar essa requisição para o Repeater pois fica mais fácil de visualizar. Observando o GET podemos ver várias informações como o host, idioma, cookies e por aí vai. Mas o interessa nesse caso é o que está na primeira linha:
GET /filter?category=Gifts HTTP/2
Essa linha é o que simboliza a querie do SQL e é nela que iremos trabalhar. Uma forma de fazer um teste é inserindo o seguinte comando em "category":
'+UNION+SELECT+'abc','def'+FROM+dual--
Vamos dar uma olhada nas particularidades desse comando, deixando de lado a parte do SQL. Os " ' " servem para quebrar a string do sistema e inserir o código, os sinais de "+" são necessários pois o burp não lê espaços e "--" é para comentarios no SQL, porém aqui ele serve para ignorar o resto da linha depois do comando. Esse comando vai inserir os campos 'abc' e 'def' no banco de dados, que pode ser vista no campo "Response"(lembrando que estou usando o Repeater, você deve se adaptar de acordo com seu método). Nesse caso você podera visualizar a inserção desses campos no final do Response.
Agora ficou fácil, a única coisa que precisamos alterar é o comando, o processo e a lógica é a mesma. O comando para descobrirmos a versão no Oracle é o seguinte:
'+UNION+SELECT+BANNER,+NULL+FROM+v$version--
Esse comando nos retorna o tipo e a versão do banco de dados, que será exibido em Response no mesmo lugar do nosso teste, solucionando o nosso laboratório.
Microsoft/MySQL
Todo o processo é o mesmo, inclusive a aplicação é igual. A única coisa que muda aqui será os comandos do SQL. O comando de teste é o seguinte:
'+UNION+SELECT+'abc','def'--+
Esse comando me deu uma dor de cabeça. Fiquei um tempo testando ele e sempre dava erro, então resolvi recorrer ao GP(en)T(ester) para descobrir que o que faltava era o "+" no final do comando, absurdo. De acordo com o mesmo, isso pode ter várias causas, desde problemas com truncamento, parsing e interpretação do comando.
'+UNION+SELECT+@@version,+NULL--+
Esse é o comando para exibir a versão, a única particularidade são os comandos do MySQL, e o laborátorio está resolvido.
Descobrir qual é o seu banco de dados e sua versão possibilitam o atacante explorar vulnerabilidades conhecidas para aquele sistema. Algumas formas de se proteger é evitando consultas dinâmicas com queries preparadas, sanitização das entradas do usuário e boas práticas de programação. Caso tenha alguma dica, por favor, compartilhe!
Por hoje é isso, muito obrigado pela atenção. Desculpem se o blog ficou um pouco grande, tentei resumir o máximo possível.