SQL Injection

3 years ago 172
BOOK THIS SPACE FOR AD
ARTICLE AD

Leonardo Teodoro

O SQL injection é uma vulnerabilidade de segurança da web que permite que um invasor interfira nas consultas que um aplicativo faz ao seu banco de dados.

Geralmente, permite que um invasor visualize dados que normalmente não seria capaz de visualizar. Isso pode incluir dados pertencentes a outros usuários ou quaisquer outros dados que o próprio aplicativo é capaz de acessar.

Em muitos casos, um invasor pode modificar ou excluir esses dados, causando alterações persistentes no conteúdo ou comportamento do aplicativo.

Em algumas situações, um invasor pode escalar um ataque de injeção de SQL para comprometer o servidor subjacente ou outra infraestrutura de back-end, ou realizar um ataque de negação de serviço.

Um ataque de SQL injection bem-sucedido pode resultar em acesso não autorizado a dados confidenciais, como senhas, detalhes de cartão de crédito ou informações pessoais do usuário.

Muitas violações de dados de alto perfil nos últimos anos foram resultado de ataques de SQL injection, levando a danos à reputação e multas regulatórias. Em alguns casos, um invasor pode obter um backdoor persistente nos sistemas de uma organização, levando a um comprometimento de longo prazo que pode passar despercebido por um longo período.

Há uma grande variedade de vulnerabilidades, ataques e técnicas de SQL injection que surgem em diferentes situações. Alguns exemplos comuns de injeção de SQL são:

Recuperar dados ocultos, onde você pode modificar uma consulta SQL para retornar resultados adicionais.

Subverter a lógica do aplicativo, onde você pode alterar uma consulta para interferir na lógica do aplicativo.

Ataques UNION, onde você pode recuperar dados de diferentes tabelas de banco de dados.

Examinar o banco de dados, onde você pode extrair informações sobre a versão e estrutura do banco de dados.

Injeção cega de SQL, em que os resultados de uma consulta que você controla não são retornados nas respostas do aplicativo.

A injeção de SQL pode ser detectada manualmente usando um conjunto sistemático de testes em cada ponto de entrada no aplicativo. Isso normalmente envolve:

Enviar o caractere de aspas simples ‘ e procurar erros ou outras anomalias.

Enviar alguma sintaxe específica de SQL que avalia o valor base (original) do ponto de entrada e um valor diferente e procurando diferenças sistemáticas nas respostas do aplicativo resultante.

Enviar condições booleanas como OR 1 = 1 e OR 1 = 2 e procurar diferenças nas respostas do aplicativo.

Enviar payloads projetadas para disparar atrasos quando executados em uma consulta SQL e procurar diferenças no tempo necessário para responder.

Envio de payloads OAST projetadas para acionar uma interação de rede fora de banda quando executado em uma consulta SQL e monitorar todas as interações resultantes.

Considere um aplicativo de compras que exibe produtos em diferentes categorias. Quando o usuário clica na categoria Presentes, o navegador solicita o URL:

https://insecure-website.com/products?category=Gifts

Isso faz com que o aplicativo faça uma consulta SQL para recuperar detalhes dos produtos relevantes do banco de dados:

SELECT * FROM products WHERE category = ‘Gifts’ AND released = 1

Esta consulta SQL pede ao banco de dados para retornar:

todos os detalhes (*)
da tabela products
onde a categoria é Gifts
e released é 1.

A restrição released = 1 está sendo usada para ocultar produtos que não foram liberados. Para produtos não liberados, presumivelmente released = 0.

O aplicativo não implementa nenhuma defesa contra ataques de injeção de SQL, portanto, um invasor pode construir um ataque como:

https://insecure-website.com/products?category=Gifts'--

Isso resulta na consulta SQL:

SELECT * FROM products WHERE category = ‘Gifts’ -- ‘ AND released = 1

O principal aqui é que a sequência de traços duplos --é um indicador de comentário em SQL e significa que o resto da consulta é interpretado como um comentário. Isso remove efetivamente o restante da consulta, de modo que não inclui mais AND released = 1. Isso significa que todos os produtos são exibidos, incluindo produtos não liberados.

Indo além, um invasor pode fazer com que o aplicativo exiba todos os produtos em qualquer categoria, incluindo categorias que ele não conhece:

https://insecure-website.com/products?category=Gifts'+OR+1=1--

Isso resulta na consulta SQL:

SELECT * FROM products WHERE category = ‘Gifts’ OR 1=1 — ‘ AND released = 1

A consulta modificada retornará todos os itens em que a categoria é Gifts ou 1 é igual a 1. Como 1 = 1 é sempre verdadeiro, a consulta retornará todos os itens.

Read Entire Article