Se há uma coisa que os cibercriminosos adoram são os dados. Dados roubados são altamente valiosos em mercados ilícitos, e o acesso a bancos de dados privados pode ser uma ótima maneira de atores mal-intencionados lucrar com seus empreendimentos. Uma maneira de acessar dados privados é por meio de uma injeção de SQL. Mas o que exatamente é uma injeção de SQL, como ela funciona e como esse ataque pode ser evitado?
O que é uma injeção de SQL?
Os programas de software dependem do código para funcionar. O código também é a linguagem que as máquinas usam para conduzir operações e pode vir de várias formas (Python, JavaScript, C++, etc.). Muitas vezes, é por meio do código que os cibercriminosos podem atacar as vítimas, e as injeções de SQL (ou SQLis) não são diferentes. Isso permite que atores mal-intencionados "injetem" código nocivo em uma instrução SQL.
Vamos primeiro ver o que significa SQL.
SQL significa Linguagem de Consulta Estruturada. Este é outro tipo de linguagem de programação especificamente usado ao lidar com bancos de dados. Desenvolvido na década de 1970 pela IBM, o SQL pode manipular, armazenar e recuperar informações do banco de dados. Muitos sistemas de comunicação de banco de dados em todo o mundo usam SQL, portanto, não é surpresa que os agentes de ameaças tenham desenvolvido maneiras de abusar dele para atingir os bancos de dados.
As instruções SQL formam uma parte fundamental da comunicação do banco de dados. Uma instrução SQL é um comando que vem em muitas formas diferentes. Alguns alteram os dados, alguns os recuperam ou excluem e alguns podem alterar a estrutura do próprio banco de dados. Quando ocorre uma injeção SQL, o código malicioso é injetado em uma instrução SQL.
Obviamente, um site ou aplicativo precisa estar usando a linguagem de programação SQL para que uma injeção de SQL seja possível. Mas como funciona esse vetor de ataque?
Digamos que você tenha uma linha regular de código usada por um aplicativo. Quando um cibercriminoso insere uma injeção de SQL maliciosa, é adicionada uma linha de código que pode interferir nas consultas que o próprio aplicativo faz e envia ao seu banco de dados. Ao fazer isso, o banco de dados pode ser explorado de forma a permitir que o agente da ameaça visualize dados aos quais, de outra forma, não teria acesso.
A partir daqui, o cibercriminoso pode roubar dados para explorá-los diretamente ou vendê-lo na dark web ou em outro lugar. Eles também podem alterar, adicionar ou excluir dados do banco de dados de destino. Dependendo do grau do ataque de injeção de SQL, muitos danos podem ser causados. Se detalhes de pagamento, números de previdência social ou outros tipos de dados privados forem acessados, muitas pessoas correm o risco de serem exploradas.
Por outro lado, se o invasor conseguir alterar significativamente o banco de dados, grandes quantidades de dados poderão ser perdidas permanentemente. Em suma, as injeções de SQL podem destruir bancos de dados inteiros com apenas um ataque. Embora existam desde 1998, ainda são relevantes e perigosos em nossos dias atuais.
Como encontrado pelo Open Web Application Security Project (OWASP), 274.000 instâncias de injeções de SQL foram identificadas ao testar aplicativos quanto à presença de tal ataque em 2021.
Os tipos de injeção SQL
Existem alguns tipos diferentes de injeção de SQL, sendo as três principais injeções cegas, dentro da banda e fora da banda.
Uma injeção SQL cega (ou inferencial) ocorre quando o aplicativo ou site é atacado pelo injeção, mas as respostas HTTP (Hypertext Transfer Protocol) fornecidas não contêm o resultado da Consulta SQL. Em outras palavras, nenhum dado do banco de dados atacado é fornecido ao cibercriminoso. Então, qual é o ponto disso?
Usando uma injeção cega de SQL, um invasor envia dados para o servidor de destino e pode discernir certas coisas sobre um banco de dados por meio da natureza da própria resposta HTTP. Além disso, fatores associados à resposta HTTP podem ajudar o invasor a criar outra injeção de SQL mais eficaz para acessar o banco de dados.
Existem dois tipos principais de injeção SQL cega, conhecida como baseada em tempo e booleana. Essas duas variantes são bastante semelhantes em sua natureza. Uma injeção de SQL booleana e baseada em tempo envia uma matriz de perguntas de resposta sim ou não, embora a última exija que o banco de dados espere um pouco antes de responder às consultas.
Em seguida, há injeções de SQL em banda. As injeções de SQL em banda permitem que o operador realize o ataque e obtenha o resultado desejado usando o mesmo canal. As injeções SQL dentro da banda são as mais usadas, simplesmente porque são as mais fáceis de realizar devido ao fato de exigirem apenas um canal.
Por último, você tem uma injeção de SQL fora de banda. Esta é essencialmente a versão alternativa de uma injeção de SQL em banda, em que o invasor não pode realizar o ataque no total usando um único canal. Como alternativa, um ataque pode precisar recorrer a uma injeção de SQL fora de banda se o servidor de destino simplesmente não for rápido o suficiente para fornecer resultados.
Esses fatores tornam o processo um pouco mais difícil, o que significa que ele deve contar com certos recursos para estar ativo no banco de dados de destino para obter sucesso. Por exemplo, a plataforma que está sendo atacada deve ter falta de sanitização de entrada. Por causa disso, as injeções de SQL dentro da banda são muito mais comuns do que as injeções de SQL fora da banda. Mas eles ainda acontecem.
As injeções de SQL podem ser evitadas?
As injeções de SQL são uma preocupação maior para empresas e organizações do que para indivíduos comuns. Mas há coisas que esses alvos em potencial podem fazer para diminuir a chance de serem atingidos por tal ataque.
A sanitização de entrada é a principal prática comum para evitar injeções de SQL. Este é um processo de filtragem que verifica e limpa a entrada de caracteres perigosos. Se o código SQL for processado antes de ser higienizado, a chance de uma injeção de SQL aumentará naturalmente.
Além disso, consultas parametrizadas podem ajudá-lo a evitar injeções de SQL. São consultas que requerem pelo menos um parâmetro para execução. A aplicação de parâmetros torna mais difícil para os cibercriminosos realizar com sucesso um ataque de injeção de SQL.
Mas não há uma maneira infalível de impedir uma injeção de SQL. Como é o caso de muitos ataques cibernéticos, é praticamente impossível manter seus dispositivos e sistemas totalmente herméticos. Quando se trata de injeções de SQL, o melhor que você pode fazer é limpar todas as entradas e estabelecer consultas parametrizadas.
As injeções de SQL são antigas, mas ainda são uma ameaça
Embora as injeções de SQL existam há mais de 20 anos, elas ainda representam um risco para muitos sites e aplicativos. Portanto, é uma boa ideia manter essa forma de ataque em mente e tomar as medidas necessárias para tentar evitá-la, pois ela pode representar uma ameaça para seus bancos de dados em algum momento no futuro.