Pular para o conteúdo
SDETRole
SDETRole

Glossário · Segurança

SQL injection

Também chamado de: SQLi, injeção de SQL, injeção SQL, SQL injection attack

Definição

Vulnerabilidade em que a entrada do usuário é concatenada em uma query SQL, permitindo que um atacante mude a lógica da query para ler, alterar ou apagar dados.

O SQL injection (SQLi, ou injeção de SQL) acontece quando uma aplicação monta um comando SQL colando a entrada do usuário dentro da string da query. Se a entrada contém sintaxe SQL, o banco de dados a executa como parte da query. Dependendo da query e das permissões do banco, um atacante pode burlar um login, ler dados de outros usuários, modificar registros ou, nos piores casos, executar comandos no servidor. Ele está na categoria A03 Injection do OWASP Top 10 2021.

Exemplo

Código Java vulnerável:

String sql = "SELECT * FROM users WHERE email = '" + email + "'";
ResultSet rs = conn.createStatement().executeQuery(sql);

Se email for ' OR '1'='1, a query vira:

SELECT * FROM users WHERE email = '' OR '1'='1'

A condição é sempre verdadeira, então a query retorna todos os usuários. A correção é uma query parametrizada, na qual a entrada é enviada separada do texto SQL e nunca consegue mudar a sua estrutura:

PreparedStatement ps = conn.prepareStatement("SELECT * FROM users WHERE email = ?");
ps.setString(1, email);
ResultSet rs = ps.executeQuery();

O que um tester verifica

Com autorização por escrito, em um ambiente de teste:

  • Quebre a sintaxe. Envie uma aspa simples ' em cada campo de texto, parâmetro de URL, header e valor JSON que possa chegar a uma query. Um erro 500, uma mensagem de erro do banco ou uma mudança na quantidade de resultados indicam que a entrada chega ao SQL sem escape.
  • Mude a lógica. Compare value' AND '1'='1 com value' AND '1'='2. Se as duas respostas diferem de um jeito que o valor puro não explica, a entrada está sendo interpretada.
  • Olhe para entradas menos óbvias. Colunas de ordenação, campos de filtro, caixas de busca e parâmetros de relatórios muitas vezes são montados dinamicamente, porque nomes de colunas não podem ser passados como parâmetros.
  • Verifique o tratamento de erros. Erros de banco, nomes de tabelas ou stack traces nas respostas já são um achado por si só.

Ferramentas como o sqlmap automatizam uma investigação mais profunda, mas só as rode contra sistemas que você tem permissão explícita para testar, porque elas podem modificar ou apagar dados.

Defesas a verificar

Queries parametrizadas ou um ORM usado corretamente em todos os lugares; allow-lists para identificadores dinâmicos, como colunas de ordenação; uma conta de banco de dados com privilégio mínimo; e mensagens de erro genéricas. A validação de entrada ajuda, mas não substitui a parametrização.

Digite para buscar em todo o SDETRole.

Busca de texto completo com Pagefind · roda no seu navegador Abrir página de busca →