Pular para o conteúdo principal

Questão de Banco de Dados — SQL — VUNESP 2023

Banco de DadosSQL
Código
vu078911
Banca
VUNESP
Órgão
TCM-SP
Ano
2023
Nível
Superior
Cargo
Auditor de Controle Externo - Especialidade: Tecnologia da Informação
Suspeita-se que um sistema web esteja sujeito a ataques do tipo SQL Injection. Sua página de acesso possui campos para digitação de login e senha e sabe-se que o script responsável por autenticar o usuário o faz por meio de uma única query do tipo SELECT, acessando a tabela de usuários da aplicação e fazendo uma busca por login e senha em texto claro (sem usar hash ou encriptação). Um procedimento que tem o potencial de fornecer acesso ao sistema, sem o conhecimento de um login e senha válidos (considerando que para conseguir acesso a query deva trazer algum resultado), seria digitar o seguinte conteúdo em um dos dois campos (podendo o atacante tentar nos dois):
  1. A' AND '1' <> '1
  2. B' OR 'A' <> 'A
  3. C' OR 'A' = 'A
  4. D' AND '1' = '1
  5. E' AND senha <> '
Revelar gabarito e comentário

GabaritoC — ' OR 'A' = 'A

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

SQL Injection: Bypass de Autenticação

Gabarito: letra C. A injeção clássica insere uma condição sempre verdadeira (como 'A'='A') combinada com o operador OR, fazendo com que a cláusula WHERE da query retorne todos os registros – garantindo acesso sem credenciais válidas. A pegadinha está na precedência de operadores: AND é avaliado antes de OR, por isso a injeção só funciona com segurança quando inserida no campo da senha (e não no login).

O script de autenticação usa uma query do tipo:

SELECT * FROM usuarios WHERE login = '...' AND senha = '...';

Se o atacante digitar no campo senha: ' OR 'A'='A, a query se torna:

SELECT * FROM usuarios WHERE login = '...' AND senha = '' OR 'A' = 'A';

Pela precedência, isso equivale a:

SELECT * FROM usuarios WHERE (login='...' AND senha='') OR ('A'='A');

Como 'A'='A' é sempre verdadeiro, a cláusula WHERE é verdadeira para todas as linhas, e a query retorna todos os registros – o que é suficiente para o sistema considerar a autenticação bem-sucedida.


  1. 1Query originalSELECT * FROM usuarios WHERE login='...' AND senha='...'
  2. 2Injeção no campo senha' OR 'A'='A
  3. 3Query resultanteSELECT * FROM usuarios WHERE (login='...' AND senha='') OR ('A'='A')
  4. 4WHERE sempre verdadeira'A'='A' é TRUE → retorna todos os registros
  5. 5Acesso concedido
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

' AND '1' <> '1 Insere uma condição AND com uma comparação falsa ('1' <> '1 é false). Isso torna a WHERE inteira falsa, não retornando nenhum registro.

Alternativa B — ❌ Incorreta

' OR 'A' <> 'A 'A' <> 'A' é false. O OR com falso não altera o resultado da expressão original. Em nenhum dos campos isso concede acesso – no máximo, retornaria um registro se o login ou senha coincidissem com o valor vazio, o que não é garantido.

Alternativa C — ✅ Correta ⟵ GABARITO

' OR 'A' = 'A Conforme explicado, ao ser inserido no campo da senha, a condição 'A'='A' (sempre verdadeira) combinada com OR torna a WHERE verdadeira para todas as linhas, burlando a autenticação.

Alternativa D — ❌ Incorreta

' AND '1' = '1 '1'='1' é true, mas o AND com verdadeiro apenas mantém a condição original. Não acrescenta nenhum atalho – a senha ainda precisa ser verificada.

Alternativa E — ❌ Incorreta

' AND senha <> ' A string está incompleta e provavelmente geraria erro de sintaxe ou uma condição sem efeito prático. Além disso, AND não cria um caminho para bypass sem senha válida.


NÃO CAIA NESSA!

A banca explora a precedência de operadores (AND > OR). A injeção ' OR 'A'='A só garante sucesso se digitada no campo da senha; no login, ela ainda dependeria da senha. Muitos candidatos marcam a alternativa D, achando que AND '1'='1' resolve, mas ela não torna a condição incondicionalmente verdadeira.

PEGA ESSA DICA!

Sempre que uma questão de SQL Injection mencionar bypass de autenticação, procure por uma condição sempre verdadeira (como 1=1 ou 'A'='A') combinada com OR. E lembre-se de avaliar a precedência e o campo onde a injeção é inserida.


Gabarito: letra C

Link permanente: /questoes/vu078911