Você sabe o que é SQL Injection ?

Saudações, cidadãos do mundo.

Um pouco da minha história...

Muitos que trabalham com desenvolvimento de software possuem um ponto de partida, seja na criação de aplicações mobile, desktop ou WEB. Comigo, o primeiro contato com o mundo do desenvolvimento de sistemas foi com o desenvolvimento WEB, mais especificamente PHP. E foi amor a primeira vista...
Lembro que o meu primeiro estágio, ainda como aluno do curso técnico, foi o primeiro contato mais rebuscado que tive com PHP. Antes, ainda quando criança, já havia tido algumas experiências com essa linguagem, mas nada além de estudos mesmo. Foi com PHP que aprendi a programar.
Pois bem, como já disse aqui em algumas postagens, um dos assuntos que mais me fascina em todas áreas de atuação da computação é a segurança da informação. E com o desenvolvimento WEB não seria diferente, mergulhei a fundo no estudo sobre as principais vulnerabilidades (falhas de segurança) encontradas neste meio e, a cada nova falha estudada, eu descobria novas formas de me defender delas. Dentre estas inúmeras falhas, destaco aqui neste post uma das mais populares, a SQL Injection.



O que é SQL Injection (Injeção de SQL) ?

A tradução literal para o português, "Injeção de SQL", explica basicamente o que é a falha. Como você já deve imaginar, por se tratar de SQL (Structured Query Language), sim, temos o envolvimento de banco de dados. Sendo assim, a SQL Injection é a injeção de comandos maliciosos, na linguagem SQL, diretamente no seu banco de dados.

Como códigos são "injetados" no banco de dados?

Como todos sabemos, hoje em dia, é quase impossível uma aplicação WEB não possuir nenhum tipo de conexão com banco de dados, seja ela via Postgree, MySql, SQLServer, etc. Normalmente, à nivel do usuário final, a camada de banco de dados é separada da camada da aplicação, sendo possível acessar o banco de dados apenas por intermédio da aplicação. E como nós também já sabemos, o que mais temos por aí são aplicações desenvolvidas sem o devido foco na questão da segurança. É aí que entra a Injeção de SQL...
A SQL Injection consiste na exploração do não tratamento de consultas SQL executadas no banco de dados através da aplicação. Em outras palavras, esta falha explora pontos da aplicação onde são pegos dados de entrada (uma caixa de texto que peça para o usuário entrar com uma pesquisa, por exemplo) para construir uma consulta SQL sem o devido tratamento destes dados.

Vamos a um exemplo...
Imagine que em algum determinado ponto da sua aplicação é executada a seguinte consulta SQL, onde os valores "nome" e "sobrenome" são recebidos a partir de uma caixa de texto digitado pelo usuário:

SELECT * FROM Clientes WHERE nome='Galinha' AND sobrenome='Programadora';

Pois bem, se ele digitar apenas "Galinha" no campo "nome" e "Programadora" em "sobrenome", provavelmente a consulta funcionará da forma esperada e irá retornar de fato o cliente cujo nome é "Galinha Programadora". Agora, se, na montagem da consulta SQL, os dados de entrada "nome" e "sobrenome" não forem filtrados, no nível da aplicação, podemos ter algumas complicações.
Se por acaso o usuário entrar com o seguinte dado:

Nome = Galinha '
Sobrenome = Programadora

A consulta formada será:

SELECT * FROM Clientes WHERE nome='Galinha '' AND sobrenome='Programadora';

Como você pôde perceber, a consulta acima possui um erro de sintaxe e, quando executada, será obtido um erro fornecido pelo seu SGBD (Sistema de Gerenciamento de Banco de Dados). Aí que se encontra o problema... Para uma pessoa mal intencionada, isto é tudo que ela precisa saber para começar um ataque por injeção de SQL (SQL Injection). Acredito que você já esteja começando a entender o tamanho do problema...
Agora, imagine que o atacante mal intencionado entre com os seguintes dados:

Nome = Galinha '; DROP TABLE Clientes; --
Sobrenome = Qualquer coisa

A consulta formada será:

SELECT * FROM Clientes WHERE nome='Galinha '; DROP TABLE Clientes; -- AND sobrenome='Qualquer coisa';

Aí, meu caro amigo... com todo o respeito, mas ferrou!
Como pode-se perceber na consulta acima, o atacante mal intencionado utiliza-se do não tratamento na criação da consulta SQL para apagar a tabela Clientes! 
Repare que o caracter apóstrofo ('), seguido do ponto e vírgula, sinaliza o final da instrução atual. Sendo assim, o atacante apenas acrescentou a instrução para que fosse excluída a tabela "Clientes" ("DROP TABLE Clientes";),  seguido de dois caractéres hífen (-). Estes dois hífens, na sintaxe do SQL, significa comentário de uma linha, ou seja, aquele trecho de código após os hífens não será executado pelo SGBD, evitando assim erro de sintaxe.

Como se proteger contra o SQL Injection?

Simples, filtre TODOS os dados de entrada da sua aplicação. Está certo que, hoje em dia, com o avanço das tecnologias aplicadas no desenvolvimento WEB, é cada vez mais comuns o uso frameworks. A maioria deles protege-se quanto a Injeção de SQL, mas é sempre bom ficar ligado e estar atento a quaisquer tipos de falhas reportada sobre determinado framework que você utilize.

IMPORTANTE! 

Uma última observação, fiz questão aqui no texto de não relcionar a falha SQL Injection a nenhuma linguagem de programação. Ressalto aqui que todas as linguagens de programação voltadas para o desenvolvimento WEB estão suscetíveis a esta falha. Portanto, fique ligado!

Vou ficar por aqui, povo... até a próxima!


Gostou da postagem ? Tem alguma dica, crítica ou sugestão? Deixe aqui o seu comentário!

Seja alertado em seu e-mail cada vez que for publicado um novo texto!

Comentários

  1. Gostei muito do texto, porém ficou uma dúvida como o cara saberia que a tabela Cliente existe no banco? (Desculpe se a pergunta foi idiota, mas estou começando a estudar banco de dados agora).

    ResponderExcluir
    Respostas
    1. Olá, Lanusse. Tudo bem?
      Sua pergunta não foi idiota não, muito pelo contrário.
      No exemplo que dei no texto o usuário já sabia da existência desta tabela, mas de fato, normalmente, o usuário poderia não saber.
      Em uma situação real, ele poderia, por exemplo, tentar nomes mais comuns, como "Usuário", "Administrador", etc. A chance de conseguir êxito seria enorme.
      Tendo alguma outra dúvida, só perguntar! Grande abraço!

      Excluir

Postar um comentário

Mais visitados