O que é uma injeção SQL?
Definição de SQL injection
Injeção SQL (SQL injection) é uma inserção de códigos SQL maliciosos com o objetivo de deturpar o fluxo normal de solicitações para um servidor, dando aos cibercriminosos um controle sobre os bancos de dados e servidores atingidos.
O que é SQL?
SQL (Structured Query Language, ou ‘’linguagem de consulta estruturada’’) é uma linguagem de programação usada por DBMS (Database Management Systems, ou ‘’sistemas de gerenciamento de bancos de dados’’) para comunicar solicitações de informações entre um usuário e um banco de dados e seus respectivos data-tables.
Quando você digita uma palavra-chave em um buscador em um website ou um mecanismo de busca como o Google, por exemplo, solicitações feitas por SQL são feitas o tempo todo.
Estas solicitações contém a palavra-chave que o usuário inseriu, bem como os comandos para o DBMS. Aí, a solicitação é enviada para o banco de dados, é interpretada pelo DBMS e a informação solicitada é extraída e direcionada ao usuário.
De modo simplificado, o processo funciona assim:
- 1.Uma pessoa busca por um termo/uma palavra-chave.
- 2.Uma linha de SQL é criada, contendo a palavra-chave inserida pelo usuário.
- 3.A linha SQL é enviada para o banco de dados, onde é lida e interpretada pelo DBMS.
- 4.O DBMS reconhece os comandos de códigos e faz com que eles obtenham os dados solicitados pelo usuário.
- 5.As informações relevantes são enviadas para o usuário e aparecem na tela.
Como o SQL é uma linguagem de programação relativamente simples que depende do reconhecimento de palavras em inglês para as solicitações, se um website não for protegido da maneira correta, isto permite a um hacker injetar os próprios comandos SQL e realizar ações maliciosas, como se fosse um usuário normal, o que pode comprometer totalmente o servidor e o banco de dados atingido.
Como funciona uma injeção SQL?
Os hackers e crackers enganam um website com linhas de código SQL que contenham comandos inseridos por eles. Quando estas linhas de códigos maliciosos são enviadas para o banco de dados e interpretadas por ele, o DBMS faz a leitura dos comandos injetados e as considera como instruções válidas.
Logo em seguida, o DBMS executa as solicitações. Assim, os hackers conseguem comprometer o DBMS para enviar as informações que os proprietários do website geralmente mantém de forma privada.
Por exemplo: imagine que alguém quer roubar nomes de usuários e senhas de usuários de um portal de compras online. Se a segurança do website não for realmente robusta, os hackers conseguem usar brechas e vulnerabilidades e usar certas funções do website, como a busca e a execução de comandos arbitrários. Isto tudo pode ser feito através de uma injeção de SQL.
Injeções SQL podem afetar qualquer banco de dados com base em SQL, como Oracle, MSSQL, MySQL ou até mesmo o Microsoft SQL Server. E há duas ramificações principais de ataques SQL: as Injeções SQL de Primeira Ordem e as Injeções SQL de Segunda Ordem.
Injeção SQL de Primeira Ordem
As injeções SQL de Primeira Ordem são feitas com as solicitações acrescidas de uma injeção SQL que pode ser redirecionada com a solicitação atendida ou recusada. Com páginas simples exigindo artigos com uma ID usada como parâmetro, o hacker que usa este tipo de ciberataque faz testes simples para descobrir o quanto a página é vulnerável aos ataques com injeções de SQL.
Esta categoria inicial de injeções SQL tem como objetivo principal testar as estruturas de cibersegurança do website alvo, e elas ajudam a preparar os ataques e invasões propriamente ditas.
Injeção SQL de Segunda Ordem
Nestes ataques SQL, os cibercriminosos armazenam os comandos SQL maliciosos e aguardam a melhor oportunidade para injetá-los no alvo. Isto depende de como o website e o DBMS.
Quando os sistemas de proteção do alvo conseguem impedir os ataques de primeira ordem, os ataques de segunda ordem usam dados recuperados nas tentativas de explorar as vulnerabilidades e usam estas informações para uma nova consulta onde seja possível executar os comandos maliciosos secundários (daí o nome de segunda ordem).
Tipos de ataques de injeção SQL
Ataques de injeção SQL são categorizados por métodos diferentes que os cibercriminosos usam para ganhar acesso a um banco de dados. Nós podemos listar os mais significativos:
In-band SQLi (SQLi Clássico)
O In-Band SQLi é o tipo mais comum de ataque de injeção SQL e também um dos que são relativamente mais fáceis de realizar. Os cibercriminosos usam o mesmo canal para lançar um ataque contra um servidor e extrair os resultados das solicitações maliciosas.
Há duas subcategoriais principais de In-Band SQLi: a error-based SQLi (SQLi baseado em erro) e a union-based SQLi (SQLi basaeada em UNION). Nós vamos explicar melhor sobre elas de modo separado.
Error-based SQLi
As injeções de error-based SQLi (SQLi baseada em erro) são ataques que servem para fazer com que o banco de dados gere um erro que contenha várias informações sensíveis sobre a estrutura de dados.
Com estas informações fornecidas pelo log de erros, os cibercriminosos podem modificar a solicitação SQL para explorar mais vulnerabilidades e obter mais dados.
Union-based SQLi
Os ataques de union-based SQLi (SQLi baseada em UNION) usam o operador UNION para combinar os resultados de vários anúncios (ou declarações) SELECT em um único resultado que, aí, é enviado de volta com a resposta HTTP.
SQLi Inferencial (SQLi cego)
Neste tipo de injeção SQL, o agente do ataque não pode visualizar diretamente a resposta obtida com as solicitações que foram injetadas, e é exatamente por este motivo que este tipo de ataque SQL é chamado de Blind SQLi (ou ‘’SQLi cego’’).
Entretanto, eles podem observar o comportamento da aplicação e reconstruir a estrutura dela. As injeções inferenciais de SQL são subdivididas em dois tipos: blind-boolean-based SQLi (‘’SQLI cega baseada em dados booleanos’’) e o blind-time-based SQLi (‘’SQLi cega baseada em tempo’’).
SQLi cega baseada em dados booleanos (baseada em conteúdo)
Chamada de Boolean-based blind SQLi em inglês, esta modalidade é usada quando um cibercriminoso envia várias solicitações SQL que desencadeiam respostas do tipo TRUE ou FALSE, o que permite explorar mais vulnerabilidades com base nas respostas dadas pelo servidor.
SQLi cega baseada em tempo
Conhecida em inglês como time-based blind SQLi, ela forma um tipo de técnica na qual o cibercriminoso envia solicitações para o banco de dados SQL e o força a esperar por um certo período de tempo antes de enviar as respostas.
Se o website não responder de forma imediata, isto indica que ele é vulnerável a ataques de injeção SQL.
SQLi fora de banda
O SQLi fora de banda (out-of-band SQLi) é um ataque que explora vulnerabilidades e permite aos hackers retirar dados (incluindo detalhes de informações pessoais de usuários, por exemplo) através de canais HTTP ou DNS.
Quais são os objetivos de um ataque de injeção SQL?
Os principais objetivos dos ataques de injeção SQL são explorar as vulnerabilidades de um website através de solicitações com linhas de código SQL maliciosas que são injetadas no banco de dados.
Estes comandos permitem aos hackers obter respostas do banco de dados e, a partir delas, saber mais sobre as falhas de segurança da plataforma, aplicação ou website.
Assim, os cibercriminosos conseguem executar comandos, invadir estes bancos de dados e roubar informações e dados sigilosos, como nomes de log in, as senhas e até informações de cartão de crédito das vítimas.
Se um website não tiver uma proteção adequada, não há praticamente nenhum limite para a quantidade de dados que um hacker pode acessar através destas injeções SQL. Eles podem roubar praticamente qualquer coisa que estiver no banco de dados invadido.
Com comandos SQL simples, os criminosos conseguem forçar o banco de dados a enviar listas completas de todos os conteúdos, por exemplo, o que garante praticamente um mapa de todas as seções dos bancos de dados. Aí, é só solicitar as informações que eles querem e, pronto, o servidor infectado fornece tudo.
Exemplo de injeção SQL
Um grande exemplo de injeção SQL é o uso do comando UNION, que pode ser utilizado para agregar ‘’sub-queries’’ (ou sub solicitações/consultas) à consulta principal do usuário. Estas sub-solicitações podem forçar um banco de dados a retornar informações adicionais junto com os resultados da busca legítima.
Com este método, um hacker pode acessar a tabela que contenha os endereços de e-mail, nomes de usuários, senhas e outras informações sigilosas das pessoas que acessam o portal, plataforma, aplicativo ou website.
Além de roubar os dados pessoais das vítimas, as injeções SQL podem permitir que o cibercriminoso ganhe controle administrativo do próprio website. E há vários exemplos reais de ataques com injeções de SQL.
Ao longo de 2008, uma série de servidores brasileiros (incluindo páginas de órgãos governamentais) foram atacadas com injeções de SQL que deixaram clara a necessidade de melhorias em cibersegurança no Brasil.
Os ataques foram feitos com ajuda da Asprox, uma rede formada por computadores infectados (de forma parecida com as botnets criadas para executar ataques DDoS) que faziam buscas no Google com o objetivo de identificar websites com vulnerabilidades, o que facilitava os ataques com SQL.
Em outubro de 2015, criminosos conseguiram roubar informações de 156.959 clientes da empresa britânica de telecomunicações TalkTalk através de um ataque com injeção de SQL contra os servidores dela.
Em 11 de agosto de 2016, os servidores da Epic Games foram atacados com injeções de SQL e os cibercriminosos roubaram os dados de mais de 800 mil usuários da plataforma online de jogos. O ataque foi feito através de uma vulnerabilidade no vBulletin, o programa que era usado para gerenciar e operar os fóruns online da empresa.
Como encontrar vulnerabilidades de injeções SQL?
É extremamente importante saber identificar se uma aplicação, servidor, banco de dados ou website possuem vulnerabilidades que podem ser usadas para permitir ataques de injeção de SQL.
Aqui, nós separamos algumas ferramentas e estratégias importantes para fazer esta detecção de brechas de segurança.
Sqlmap
Usar o Sqlmap é muito importante, já que ele é uma ferramenta de testes de infiltração. Ele é feito em open source (código aberto) e faz uma análise de um sistema para encontrar vulnerabilidades e falhas de segurança.
O Sqlmap permite ‘’derramar’’ o conteúdo de uma database inteira, o que garante a identificação de vulnerabilidades nela. Só que os cibercriminosos também podem usar esta ferramenta com objetivos perigosos, é claro.
Então, é melhor fazer esta identificação e a correção dos erros de segurança antes que um hacker faça isto por você – e use as fraquezas do seu website para realizar as injeções SQL.
Vega
Outra ferramenta interessante é o Vega, que faz verificações para identificar se o banco de dados foi atingido por injeções de SQL ou ataques XSS (os chamados Cross-Site Scripting). Ele tem versões compatíveis com sistemas Windows, Linux e macOS e é bastante intuitivo de usar.
Hacker Target
O Hacker Target faz uma varredura para encontrar brechas de segurança com foco em identificar injeções SQL cegas e injeções SQL baseadas em erro que usam consultas com GET de protocolo HTTP (uma categoria de URL).
suIP.biz
E, para concluir nossa lista, não podemos deixar de recomendar o suIP.biz, usado para fazer testes com injeções SQL em DBMS como o Microsoft SQL Server, o MySQL e o Oracle. Uma das formas mais interessantes de descobrir vulnerabilidades de segurança que permitem ataques de injeção SQL é realizando seus próprios ataques SQL.
Como se proteger contra os ataques de injeção SQL
Além de fazer verificações e detectar vulnerabilidades com ferramentas como Sqlmap, suIP.biz, Hacker Target e Vega, é essencial estabelecer estratégias de prevenção. Afinal, se uma injeção SQL é bem-sucedida, mitigar os danos pode ser muito difícil e, no caso do vazamento de dados, os danos podem ser irreversíveis.
Injeções de SQL precisam ser levadas a sério, mas você pode (e deve) seguir algumas dicas de segurança que diminuem estas vulnerabilidades e evitam os danos causados por este tipo de ciberameaças.
Confira se o website é seguro
Seus dados pessoais são extremamente importantes e valiosos. Então, acredite: muita gente faria de tudo para colocar as mãos neles. Antes de inserir seus dados pessoais em algum fórum online, website, plataforma, aplicativo ou qualquer coisa do tipo, confira se a plataforma oferece segurança adequada.
Também é muito importante acompanhar as notícias sobre segurança digital e mudar suas informações de log in caso algum site que você frequenta tenha sido invadido por uma injeção SQL.
Use senhas fortes e confiáveis
Nada de combinações óbvias. Se sua senha é 123456, por exemplo, as chances de seus dados serem roubados em um ataque de injeção SQL são muito maiores.
Dê preferência para senhas com 12 caracteres ou mais, alterne entre maiúsculas e minúsculas e use caracteres especiais sempre que possível. Outra dica bastante importante é usar um bom gerenciador de senhas.
Realize a segregação dos dados
Esta dica é muito importante caso você gerencie um banco de dados. Evitar os danos é muito melhor que correr atrás dos prejuízos. E reunir tudo em um único banco de dados facilita e muito as ações de ataques com injeção SQL.
Quanto mais centralizados seus dados forem, piores são os efeitos de uma injeção SQL. Imagine um ataque contra uma loja online que guarde os dados de milhares de clientes em um banco de dados: com os dados reunidos em uma única tabela de conteúdo no banco de dados, o roubo das informações fica muito mais fácil.
Agora, se os dados ficam divididos em grupos menores, isto dificulta a vida dos cibercriminosos. Dividir as informações entre bancos de dados diferentes é uma forma muito eficiente de evitar danos potenciais e fazer a redução de danos.
Assim, se um banco de dados é invadido, os dados concentrados em outros banco de dados não serão atingidos, o que não só diminui o vazamento das informações como permite um melhor tempo para uma reação à invasão.
Escaping
O Escaping é um modo bastante popular e relativamente simples de evitar ataques de injeção de SQL, apesar de poder ser falho. Como o nome diz, a estratégia consiste em evitar todos os caracteres que tenham um significado especial na linguagem SQL.
Ao consultar um manual para um DBMS de SQL, é possível verificar quais caracteres possuem um sentido no SQL, o que permite a criação de uma blacklist mais efetiva dos símbolos que precisam de uma tradução.
Isto faz com que as solicitações enviadas pelos hackers sejam mais difíceis de retornar com os dados e informações que eles querem obter.
Validação de entradas
A validação de entradas (input validation), também chamada de ‘’sanitização’’, pode ser implementada no backend de um website, junto com uma white-list (ou lista de permissões) de caracteres e termos aceitos. A white-list pode ser atualizada sempre que novos itens forem adicionados ao banco de dados.
Se um hacker procurar por um comando de código malicioso para fazer a consulta ao banco de dados, o sistema verifica a entrada e faz uma comparação com os itens contidos na lista de permissões.
Se o termo inserido na solicitação não estiver presente na white-list, aí o código não é executado e uma resposta de negação de resultados (‘’no results’’, por exemplo) é enviada, ao invés dos resultados que o criminoso pretendia obter.
Declarações prontas
Outra estratégia defensiva importante para quem gerencia bancos de dados é implementar Prepared Statements (Declarações Prontas).
Websites mais visados por cibercriminosos geral uma consulta SQL sempre que alguém envia uma solicitação, e isto dá aos hackers a oportunidade de injetar os códigos SQL maliciosos.
Uma boa forma de evitar isto é programar seu website para usar templates SQL pré-fabricados, com valores fixos e marcações de interrogação onde as palavras-chave apareceriam normalmente.
Assim, seu DBMS pode ser codificado para ler as marcações de interrogações como qualquer tipo de dado na barra de pesquisas. Com as Prepared Statements, o hacker não vai conseguir adicionar nenhum comando novo nas linhas de códigos SQL.
Use um firewall de aplicação
Com um WAF (Web Application Firewall, ou ‘’firewall de aplicação web’’), seu banco de dados fica mais protegido contra várias ameaças, incluindo injeções SQL.
Um WAF é uma forma específica de firewall de aplicação (ou firewall de aplicativo) usado para fazer o monitoramento, a filtragem e o bloqueio de tráfego HTTP que entra e sai de um serviço web.
O firewall de aplicação inspeciona o tráfego HTTP e previne ataques de exploit (ou seja, ataques que usam vulnerabilidades de segurança) como XSS (cross-site scripting), inclusão de arquivos (file inclusion), injeções SQL e configurações de sistema inapropriadas.
Faça a criptografia dos dados
Com a criptografia dos dados do servidor, os dados ficam protegidos na database. Isto impede que os hackers acessem dados reais, mesmo que a solicitação ao servidor retorne com alguma resposta que os hackers queriam acessar.
Para conseguir acessar as informações reais, os cibercriminosos precisariam decodificar esta criptografia, o que pode ser extremamente difícil ou até praticamente impossível dependendo do nível da criptografia.
Mantenha os programas de segurança atualizados
É vital manter os programas de cibersegurança sempre atualizados. Isto ajuda a corrigir de forma automática falhas de segurança que podem ser usadas para injeções de SQL, por exemplo, além de várias outras ameaças cibernéticas.
Personalize as permissões de acesso ao banco de dados
Outro mecanismo de defesa bastante importante é configurar e limitar as permissões do banco de dados usado pela aplicação web, permitindo o acesso apenas aos elementos mais essenciais. Isto ajuda a reduzir a efetividade de qualquer ataque de injeção SQL que possa explorar bugs existentes na aplicação web.
No Microsoft SQL Server, por exemplo, um logon da database pode ser impedido de selecionar alguns dos conteúdos do sistema, o que ajuda a limitar exploits que tentam inserir JavaScript em todas as colunas de texto do banco de dados.
Mapeadores relacionais de objetos
Para os desenvolvedores de aplicações web, os mapeadores relacionais de objetos (Object Relational Mappers, também conhecidos pela sigla ORM) são um recurso muito interessante. Desenvolvedores podem utilizar estruturas ORM para criar consultas aos bancos de dados feitas de maneiras seguras e mais confiáveis.
Com estas consultas mais estruturadas do que aquelas construídas em strings de SQL, as vulnerabilidades usadas para ataques de injeção SQL são reduzidas de modo bastante significativo.