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):
A' AND '1' <> '1
B' OR 'A' <> 'A
C' OR 'A' = 'A
D' AND '1' = '1
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.
1Query originalSELECT * FROM usuarios WHERE login='...' AND senha='...'
2Injeção no campo senha' OR 'A'='A
3Query resultanteSELECT * FROM usuarios WHERE (login='...' AND senha='') OR ('A'='A')
4WHERE sempre verdadeira'A'='A' é TRUE → retorna todos os registros
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.