Questão nº 73
Questão de Administração de Banco de Dados · FGV MPAL 2018 (nº 73)
Considere que o comando a seguir, seja executado em um aplicativo Web, após a requisição dos dados usuário/senha.
```
sql = "SELECT FROM PESSOA
WHERE Nome ='" + txtNome + "'"
AND Senha ='" + txtPwd + "'"
```
Assinale os textos digitados maldosamente, armazenados respectivamente nas variáveis txtNome e txtPwd*, que caracterizariam uma invasão do tipo "SQL Injection".
- A```
' and '1=1'
' and '1=1'
``` - B```
' or ''='
' or ''='
``` (alternativa correta) - C```
or '=''
or ''='
``` - D```
or '1=1'
or '1=1'
``` - E```
' and ''=''
' and ''=''
```
Resposta comentada
Gabarito Alternativa B
SQL Injection é uma técnica maliciosa onde um atacante insere código SQL (Structured Query Language) em campos de entrada de um aplicativo para manipular as consultas do banco de dados, muitas vezes para contornar a autenticação ou extrair dados confidenciais.
- (A) Incorreta: A entrada
' and '1=1'resultaria emNome ='' and '1=1'', que é uma sintaxe SQL inválida devido às aspas simples desbalanceadas, causando um erro no banco de dados em vez de um bypass. - (B) Correta: Se
txtNome = ' or ''='etxtPwd = ' or ''=', a consulta se tornaSELECT * FROM PESSOA WHERE Nome ='' or ''='' AND Senha ='' or ''=''. A primeira aspa simples emtxtNomefecha a string doNome, eor ''=''(que éOR TRUE) torna a condiçãoNomesempre verdadeira. O mesmo ocorre paraSenha. Assim, a cláusulaWHEREse torna(TRUE) AND (TRUE), resultando emTRUE, e a consulta retorna todos os usuários, bypassando a autenticação. - (C) Incorreta: A entrada
or '=''(sem a aspa inicial) faria com que a stringor ''='fosse tratada como parte literal do nome/senha, ou seja,Nome ='or ''='''. Isso não injeta código SQL, apenas compara com uma string específica. - (D) Incorreta: Similar à alternativa C, a entrada
or '1=1'(sem a aspa inicial) seria tratada como parte literal da string, resultando emNome ='or '1=1''. Não há injeção de SQL. - (E) Incorreta: A entrada
' and ''=''resultaria emNome ='' and ''=''''. Isso se traduz emNome ='' AND TRUE, que simplifica paraNome =''. Para que a autenticação fosse bem-sucedida, tantoNomequantoSenhateriam que ser strings vazias, o que não é um bypass geral. A armadilha aqui é que, embora''=''sejaTRUE, a condiçãoANDfaz com que a cláusulaWHEREse torneNome ='' AND Senha ='', que é uma condição específica e não um bypass incondicional.
Fonte: FGV MPAL 2018 Analista do Ministério Público - Administrador de Banco de Dados (Caderno Tipo 1). Reproduzida para fins de estudo.