SQL Injection: saiba tudo sobre um ataque simples que pode ser devastador

7 min de leitura
Imagem de: SQL Injection: saiba tudo sobre um ataque simples que pode ser devastador

Nos últimos dias, o TecMundo informou em primeira mão um deface realizado pelo hacker Kuroi'SH, que "alterou a aparência" da página de busca da Google por alguns minutos. Como a Google afirmou, houve um comprometimento de servidores DNS, uma alteração maliciosa nas configurações de direcionamento desses servidores. Isso significa que os usuários que enxergaram uma página diferente da Google foram redirecionados para outra página.

O TecMundo conseguiu entrar em contato com o hacker Kuroi'SH para entender como foi essa ação — para saber mais sobre ele, em breve, você acompanhará aqui uma entrevista exclusiva. De acordo com o hacker, a ação foi realizada por meio de um SQL Injection, injeção de SQL. Foi com esta ferramenta que Kuroi'SH redirecionou os acessos e realizou o deface, cunho popular inglês para identificar uma modificação na aparência de algum objeto ou site.

Essa informação veio do próprio hacker; mesmo assim, existe a alegação de que, na verdade, o redirecionamento não foi realizado via SQL Injection. Enquanto essa questão está nebulosa, resolvemos entender o que é isso de uma maneira completa.

Você vai saber tudo que precisa para entender o que é SQL Injection

Por isso, para você entender um pouco mais sobre esses termos, saber como eles funcionam e quais implicações eles têm, resolvemos criar este TecMundo Explica. Para tanto, conversamos com um especialista no assunto: Jhonathan Davi, CEO da Insight Security, pesquisador de segurança da Inurl Brasil e finalista do Hackaflag SP 2016, campeonato hacker realizado pela Roadsec — também contamos com o suporte de outros membros que atuam no Inurl Brasil, um grupo de pesquisa de segurança, desenvolvimento de ferramentas e ativismo digital.

Além de Davi, o TecMundo foi "ao outro lado da ponte" para entender mais sobre essa história. Para isso, conversamos com o Lacking Faces, um grupo de estudos que também é uma célula — ou um braço — da Anonymous.

Jhonathan Davi, CEO da Insight Security

O que é SQL Injection

O SQL Injection é o nome dado a uma falha na codificação de uma aplicação qualquer (seja web ou local) que possibilita, por meio de um input qualquer, a manipulação de uma consulta SQL. Essa manipulação é chamada Injeção, então, o termo Injeção SQL. Resumindo: o SQL Injection é uma técnica de ataque baseada na manipulação do código SQL, que é a linguagem utilizada para troca de informações entre aplicativos e bancos de dados relacionais.

Pense em SQL Injection como uma simples falha lógica

É a linguagem de padrão universal para manipulação de dados em bancos de dados relacionais através dos SGBDs (Sistema de Gerenciamento de Banco de Dados Relacionais). É um tipo de ataque onde o "Hacker" consegue inserir comandos maliciosos (sql querys) no banco de dados através dos campos de formulários ou de URLs de uma aplicação vulnerável, ambicionando extrair informações guardadas no banco de dados", explicou Jhonathan Davi.

De acordo com o Lacking Faces, "pense em SQL Injection como uma simples falha lógica, é simplesmente uma falha que, por deixar aberta a interpretações, ocorrem manipulações indesejáveis".

"A computação é perfeita, mas quem programa os dispositivos e aplicações são estúpidos, eles não veem todas as possibilidades, eles não se importam com nada além do 'caminho que determinei', se esquecem que existem sempre muitos outros caminhos e que é função do desenvolvedor e do testador de software (algo que não existe muito nas empresas) fazer todos esses caminhos e garantir que o software se comporte adequadamente; caso não faça isso, um hacker fará", disse o grupo.

Davi participando do Hackaflag, na Roadsec

Como é feita uma injeção (narrativa)

Vamos fazer o seguinte: imagine que você está viajando e seu carro perde capacidade de bateria, isto é, ela morre. O que fazer? Se você possui um carregador no carro, poderá tentar algo e se salvar. Porém, se não tiver, outros métodos para fazer a bateria pegar também existem — por exemplo, a famosa "chupeta", na qual você conecta a sua bateria em outra que esteja em bom funcionamento.

Vamos lá: você não possui esse carregador, então precisa encontrar outro motorista que forneça a bateria. Você encontra e faz a seguinte pergunta: "Amigo, eu preciso de uma recarga, será que daria?". O outro motorista não vai entender o que você quer, certo?

Uma situação real para entender a questão

Isso porque você não especificou que precisa de uma recarga na bateria de seu carro. Você não foi explícito, e o mesmo acontece na questão do SQL: são várias interpretações. Quando uma consulta normal com entrada de filtro é feita com vulnerabilidade, um hacker pode injetar um código malicioso na sua consulta e manipulá-la, já que você a deixou aberta a várias interpretações.

Por exemplo, voltando ao motorista que ouviu "amigo, eu preciso de uma recarga, será que daria?", seria como ele se te entregasse um carregador de smartphone — e um carregador com a capacidade de danificar o seu carro.

Exemplo

Como é feita uma injeção (maneira técnica)

Basicamente, segundo o pesquisador de segurança Jhonatan Davi, injeção é a pessoa inserir comandos indevidos de forma remota em um servidor através de uma aplicação vulnerável, "onde só quem tem esse tipo de permissão é a aplicação desenvolvida por um programador".

Agora, vamos demonstrar um exemplo de injeção SQL de forma mais "técnica", enviado pelo grupo LF. Se você não tem qualquer conhecimento em programação, talvez sinta alguma dificuldade — mas acreditamos que o tópico anterior já tenha sanado as suas dúvidas. Agora, acompanhe a injeção tecnicamente.

Abaixo, há uma aplicação de uma consulta SQL sem filtro de entradas, exemplo:

  • PHP: $sql = "SELECT * FROM tableQualquer WHERE colunaQualquer = '$_POST[ValorDeFiltro]'"
  • Python: sql = "SELECT * FROM tableQualquer WHERE colunaQualquer = '{}'".format(variavelRecebidaQualquer)

Nos exemplos acima, temos em PHP e em Python, consultas SQL que estão vulneráveis a SQL. Como se pode ver, há apenas uma concatenação de uma variável qualquer recebida de fora, seja de um input de um usuário, seja pela submissão de um formulário. A consulta mostrada funciona da seguinte forma:

SELECIONE (select) TUDO (*) DA tableQualquer (nome da tabela) ONDE (where) colunaQualquer (nome da coluna) seja igual (=) variavelDeFiltro

O SQL é o mesmo, pois o SQL é um padrão que não depende da linguagem que a use, mas a inclusão de variáveis nessa consulta muda de linguagem para linguagem; sendo assim, no PHP, temos o uso de $_POST — é uma variável global indicando a requisição pelo método HTTP POST, muito comum em submissão de formulários pela web e que há variáveis nessa submissão, aqui nomeada 'ValorDeFiltro'.
Supondo que valor de filtro seja 'valorQualquer', a consulta se tornaria no final:

SELECT * FROM tableQualquer WHERE colunaQualquer = 'valorQuaquer'

O que resultaria em uma consulta SQL no banco de dados que pesquisaria na tabela 'tableQualquer' onde a coluna 'colunaQualquer' seja igual a 'valorQualquer' e retornaria todos os valores que correspondam ao 'where'. Até este ponto, uma consulta normal que funciona normalmente, correto? Correto. Porém, o hacker explora a falha injetando valores não tão normais. Pensando em um cenário que tenha um hacker, vamos supor que o valor submetido seja:

'; SELECT * from information_schema.tables WHERE TABLE_NAME != '

A consulta se tornaria no final:

SELECT * FROM tableQualquer WHERE colunaQualquer = ''; SELECT * from information_schema.tables WHERE TABLE_NAME != 

Pela pura concentração de entrada na consulta, um invasor qualquer pode manipular livremente uma consulta para fazer o que quiser. Nesse exemplo, pudemos mudar a consulta para que ela trouxesse o nome de todas as tabelas existentes no banco de dados MySQL (o mais popular).

Explicando passo a passo, a consulta era assim:

  • "SELECT * FROM tableQualquer WHERE colunaQualquer = '$_POST[ValorDeFiltro]'"

Sem a variável no final, ficou assim:

  • "SELECT * FROM tableQualquer WHERE colunaQualquer = ''"

Essa é a consulta literal. Aplicando o valor da variável na consulta literal, fica assim:

  • "SELECT * FROM tableQualquer WHERE colunaQualquer = ''; SELECT * from information_schema.tables WHERE TABLE_NAME != ''"

A abertura de chave encontra outra chave da entrada da variável, o ponto e vírgula finalizam a consulta, inicia-se outra consulta e é colocado um "where" inútil cuja única função é combinar com o fechamento da chave da consulta literal.

Veja os valores separados e junte em sua mente:

  • Literal: SELECT * FROM tableQualquer WHERE colunaQualquer = ''
  • Valor do usuário: '; SELECT * from information_schema.tables WHERE TABLE_NAME != '
  • Literal com variável: SELECT * FROM tableQualquer WHERE colunaQualquer = '$_POST[ValorDeFiltro]'
  • Literal com valor da variável: SELECT * FROM tableQualquer WHERE colunaQualquer = ''; SELECT * from information_schema.tables WHERE TABLE_NAME != ''

Assim funciona uma injeção SQL manual, "na prática, são usadas ferramentas que automatizam e traduzem todas as consultas para cada banco de dados para chegar no objetivo bastando que exista a vulnerabilidade injetável", explicou o Lacking Faces.

SQL

Questões sobre SQL com Davi

Para sanar quaisquer dúvidas restantes, vamos lhe mostrar na íntegra uma entrevista rápida que fizemos com o Jhonathan Davi, CEO da Insight Security e pesquisador de segurança da Inurl Brasil, como já apresentado. Agora, você vai entender outros pontos — até os éticos — sobre o SQL Injection.

TecMundo: O que um atacante SQL pode fazer de danoso? Tanto para empresas quanto para usuários finais?

Jhonathan Davi: Por meio de ataques SQL Injection, é possível obter qualquer tipo de dado sigiloso mantido no servidor. Dependendo da versão do banco de dados, também é possível inserir comandos maliciosos e conseguir acesso root (permissão total) à máquina em que o banco está hospedado.

TecMundo: Essa é uma técnica de hacking que exige muito conhecimento?

Jhonathan Davi: Uma criança com um conhecimento muito básico em banco de dados e na linguagem SQL consegue executar esse tipo de ataque.

TecMundo: O SQL Injection é utilizado apenas para black hat ou diversão?

Jhonathan Davi: Da minha visão, como esse tipo de ataque permite ao atacante obter dados sensíveis e sigilosos do servidor, sempre será encaixado no termo "Black hat" — nota da redação: também conhecido como cracker ou cibercriminoso, caso tenha vantagem ilícita.

Você sabia que o TecMundo está no Facebook, Instagram, Telegram, TikTok, Twitter e no Whatsapp? Siga-nos por lá.