FlawOpen

flawopen.com/Injeção de SQL

Injeção de SQL

Crítica CWE-89
Idioma: English Português (Brasil) Español Français Deutsch Русский 简体中文 日本語 हिन्दी 한국어 Bahasa Indonesia

A SQL injection acontece quando uma aplicação monta uma consulta colando a entrada do usuário no texto SQL, e o banco interpreta parte dessa entrada como comando. A correção é a mesma em todas as linguagens: enviar a consulta com placeholders e passar os valores separadamente. Escolha sua linguagem abaixo para ver as chamadas de API exatas, o código vulnerável e o corrigido e as regras de CI que detectam o problema.

Explicação em Linguagem Simples (ELI5)

Você entrega à bibliotecária uma ficha que diz 'Buscar o cadastro de: ___' e escreve no espaço em branco: 'João. E também abra o arquivo e traga todas as pastas.' Uma bibliotecária que lê a ficha inteira como uma única ordem faz as duas coisas. Colar a entrada do usuário numa string SQL monta exatamente essa ficha. Uma consulta parametrizada é um formulário impresso com uma caixa lacrada marcada 'nome': o que estiver escrito ali dentro só é procurado como nome, seja qual for o texto.

Conceitos Centrais e Termos

SQL injection (CWE-89)
A entrada não confiável é concatenada ou formatada no texto SQL, então aspas, palavras-chave e operadores da entrada mudam a estrutura da consulta em vez de serem tratados como um único valor.
Prepared statement and bind parameters
A consulta é enviada com placeholders (?, $1, :name) e analisada antes de qualquer valor chegar; os valores viajam separados e são sempre tratados como dados. É a defesa principal em todo driver e ORM.
Blind SQL injection
Quando a página não mostra resultados nem erros, o atacante deduz os dados bit a bit pelas diferenças na resposta (baseada em booleanos) ou no tempo de resposta (baseada em tempo). Ausência de saída visível não significa ausência de falha.
Second-order SQL injection
Um valor é salvo com segurança, depois lido do seu próprio banco e concatenado em outra consulta. Toda consulta precisa ser parametrizada, inclusive as que recebem dados das suas próprias tabelas.
Identifiers and allowlists
Placeholders carregam apenas valores, não nomes de tabela, nomes de coluna nem direção de ordenação. Esses devem vir de uma allowlist fixa no código, nunca copiados da requisição.

Fluxo de Ataque Passo a Paso

Passo 1

A entrada chega a uma consulta

Um campo de formulário, parâmetro de URL, cabeçalho ou campo de API é passado ao código que monta um comando SQL.

Passo 2

A entrada é colada no texto SQL

Concatenação, interpolação ou formatação insere o valor diretamente. O valor de teste inofensivo ' OR '1'='1 transforma WHERE name = '...' numa condição sempre verdadeira.

Passo 3

O banco a interpreta como sintaxe

O banco recebe uma única string, não sabe qual parte veio do usuário e executa o comando alterado com os privilégios da aplicação.

Passo 4

Dados são lidos, alterados ou apagados

Conforme a consulta e a conta, o atacante contorna um login, extrai tabelas com consultas UNION ou obtém dados às cegas. O vazamento do MOVEit Transfer em 2023 (CVE-2023-34362) começou com essa classe de falha.

Guias de SQL injection por linguagem

Python JavaScript Go Java PHP C# Ruby C/C++ Rust Kotlin Swift

Lista de Verificação de Segurança para Engenharia

Referências

Leitura relacionada

Consultas parametrizadas explicadas Um ORM basta? Stored procedures evitam SQL injection? SQL injection no MOVEit Transfer (2023) Injeção no psql do PostgreSQL (2024)