SQL injection: quais os tipos, como funciona na prática e como prevenir?

Sabemos que a segurança de um sistema é muitíssimo importante, e, normalmente, precisamos fechar todas as janelas possíveis para que nenhum dado seja exposto e evitemos as dores de cabeça. Assim, precisamos realizar tratamento também na nossa primeira porta que é a URL de acesso ao nosso aplicativo, afinal, é possível burlar a entrada por meio do SQL Injection. 

O termo URL tem o significado de Uniform Resource Locator, ou traduzido como Localizador Uniforme de Recursos. Na prática, a URL é o endereço web de acesso ao nosso site. Através dela fazemos as requisições necessárias para obtermos informações.

Bom, quer dizer que se nos protegermos de certos elementos na URL, então, não exporemos nossos dados e, nitidamente, respeitamos a Lei Geral de Proteção de Dados. Já pensou aprender a proteger sua URL e seus dados? 

Então, vamos lá!

O que são as consultas SQL?

SQL é uma linguagem de consulta de dados, então, podemos utilizá-la para realizar filtragens em bancos de dados.

Por exemplo, se tivéssemos um banco de dados em que se tem uma tabela de produtos, poderíamos fazer:  SELECT * FROM PRODUTOS a fim de que tenhamos todas as informações necessárias, bem como podemos selecionar por algum identificador como SELECT * FROM PRODUTOS WHERE NOME_PRODUTO = “Computador”.

Poderíamos ter um exemplo em que usamos os operadores OR e AND. Assim, se quiséssemos obter um produto específico teríamos:

A)

SELECT * FROM PRODUTOS 

WHERE NOME_PRODUTO = “Computador” OR VALOR_PRODUTO=5000

B)

SELECT * FROM PRODUTOS 

WHERE NOME_PRODUTO = “Computador” AND PRODUTO_ID=30

Assim, o produto em a) poderia tanto ser retornado caso seja encontrado o nome “Computador” ou que tenha valor igual a 5000. E, em b) nós teríamos de encontrar um mesmo dado que contenha o nome de “Computador” e que tenha seu identificador igual a 50.

Então, no primeiro exemplo a) qualquer um dos dois elementos pedidos no filtro pode ser verdadeiro, já no b), os dois elementos precisam ser verdadeiros a fim de que algum dados seja retornado.

O que é o SQL injection?

O SQL injection se configura quando se usa trechos de linguagem SQL dentro de uma URL, a fim de burlar a consulta e obter dados restritos. 

Os dados que estão na URL são, comumente, enviados a uma consulta SQL dentro da lógica de programação de nosso sistema. Então, um exemplo de SQL Injection em uma URL seria:

https://www.teste.com.br/login/?OR 1=1

Perceba que estamos passando em nossa URL o “OR 1=1” que é um trecho da linguagem SQL. O objetivo final é fazer com que algum trecho faça com que a chamada SQL seja verdadeira e os dados sejam retornados.

Como funciona o SQL injection?

Na prática, o SQL Injection adiciona alguns elementos a mais na URL, a fim de que ela possa acessar o banco de dados realizando uma filtragem de dados que não seriam acessíveis.

Então, pense que a partir da URL anterior “https://www.teste.com.br/login/?OR 1=1” ela seja passada para o nosso trecho da tabela de login:

SELECT * FROM USERS 

 WHERE USER=user AND PASSWORD=password OR 1=1

Pela lógica do VERDADEIRO e FALSO, temos que, mesmo que não se ache o USER e o PASSWORD, foi criada um novo elemento ao final que verifica se 1 é igual a 1 (1 = 1) e, claramente, se percebe que é VERDADEIRO.  Portanto, serão retornados todos os usuários do sistema.

Quais as diferenças entre SQL injection de primeira e segunda ordem?

A pessoa invasora entra com o trecho — uma string — malicioso e tem por objetivo causar a modificação no código SQL que é executado imediatamente. 

Então, justamente, o que se faz a partir da URL é posteriormente executado de forma imediata, e isso é dito de primeira ordem.

Já o de segunda ordem, a pessoa invasora armazena o trecho a ser executado em um local segurado, e, em algum momento uma outra atividade realizará o disparo dessa injeção no SQL.

Qual o impacto causado por um ataque SQL injection?

O impacto de um ataque SQL Injection é a exposição de dados sensíveis de uma empresa e que podem ser usados de diversas formas, seja contra o negócio ou para prejudicar algumas pessoas.

2 exemplos de SQL injection! Um de primeira ordem e outro de segunda. Saiba como funciona na prática

Exemplo de ataque de primeira ordem

Uma pessoa invasora pode verificar se uma solicitação com acréscimo de uma injeção de SQL enviada retorna ou não os dados procurados.

Usando uma página simples, que exibe um artigo com um determinado ID como parâmetro, a pessoa invasora pode realizar alguns testes simples para determinar se a página é vulnerável a ataques de injeção de SQL.

A partir de uma URL de exemplo:

http://mediapaper.com/items.js?id=2

pode-se realizar a seguinte consulta:

SELECT title, description FROM items WHERE ID = 2

A pessoa invasora pode então tentar injetar uma consulta que retorne ‘false’, veja a injeção de “and1=2”. O intuito aqui é verificar a vulnerabilidade, pois, retornando falso não haverá retorno de dados.

http://mediapaper.com/items.php?id=2and1=2

Agora a consulta SQL executada dentro do sistema deve ficar assim:

SELECT title, description FROM items WHERE ID = 2 e 1 = 2

Novamente, se o aplicativo da Web for vulnerável à injeção de SQL, então, não retornará nada, pois, o intuito foi apenas o teste. Para ter a certeza, a pessoa invasora injetará uma consulta que retorna ‘true’:

http://mediapaper.com/items.php?id=2 e 1=1

Agora, a consulta SQL executada dentro do sistema deve ficar assim:

SELECT title, description FROM items WHERE ID = 2 e 1 = 1

Como há o “1 = 1”, isso retornará true e, assim, terá acesso aos elementos buscados de título e descrição das notícias. Nessas tentativas, então, essa seria a primeira ordem, a fim de posteriormente verificar a tabela de pessoas usuárias e, possivelmente, ter o vazamento de dados sensíveis.

Exemplo de ataque de segunda ordem

A pessoa invasora realiza o processo de armazenar a injeção  do comando em um contexto oportuno e seguro. O ataque será executado em um outro momento. 

Tenhamos um exemplo em que uma aplicação armazene em banco os critérios de busca favoritos da pessoa usuária. 

Ainda que o sistema possa realizar o tratamento sobre todos os possíveis apóstrofos (‘) a fim de minimizar as possibilidades de um ataque de primeira ordem, quando estes dados são recuperados e utilizados para a composição de uma futura consulta, há a possibilidade de execução de comandos secundários. 

Considere o seguinte critério de consulta informado pela pessoa usuária: 

‘; DELETE FROM pedido; -- 

O contexto do se refere a tudo o que estará após dele será desprezado, pois ele faz com que o SQL compreenda que o restante é apenas um comentário.

A partir do tratamento de apóstrofos, teríamos o seguinte comando resultante: 

INSERT INTO favoritos (usuario_id, nome) VALUES (11, ‘Meu Ataque’, ‘’’; DELETE FROM pedido; --‘) 

A informação será, naturalmente, inserida na base de dados e como houve uma inserção, não haverá nada além de um novo dado no banco de dados.

No entanto, quando a pessoa usuária realizar um SELECT é que será realizado o DELETE, que apaga todos os dados referente aos pedidos, nesse caso hipotético.

Como se prevenir um SQL injection?

Faz-se necessário que se faça o tratamento das tentativas de invasão feitas via SQL Injection seja feita em nosso código. 

Devemos mudar, por exemplo, daqui:

Exemplo SQL Injection Antes

Para estes termos de tratamento:

Exemplo SQL Injection Depois

Como detectar possíveis vulnerabilidades a ataques SQL injection?

Nós podemos nos utilizar de ferramentas de qualidade de código que possam rastrear possíveis vulnerabilidades. Uma delas é o SonarCloud, em que enviamos o nosso repositório e ele observa o código e nos mostra possíveis correções.

Usar uma SQL injection no site de outra pessoa é crime?

Depende de seu uso.

Evidentemente que o conhecimento de SQL Injection é necessário, justamente, para prevenir ataques e seu uso pode ser tanto para um teste de vulnerabilidades quanto pode ser malicioso.

Quando você tenta executar essas injeções em um site de outra empresa, seu IP (identificação na internet) poderá ser identificado nos Logs do Sistema da empresa e poderia ser entendido como um ataque.

Assim, faz-se valer que por mais que possa querer realizar apenas um teste, pode ser entendido como sendo uma pessoa invasora.

Logo, podemos perceber que precisamos observar as possibilidades de SQL injection nas requisições por meio da URL do browser, e realizar ações necessárias para não permitir que a pessoa invasora obtenha dados sensíveis. Ressaltamos que o uso de práticas como o SQL injection deve ser feito com cautela e em ambiente simulado, não prejudicando ou colocando em risco a integridade de sistemas alheios. 

Continue seus estudos de SQL aprendendo sobre o comando SQL BETWEEN, em que você pode selecionar valores entre um determinado intervalo!