Boa tarde, fiquei com dúvida com relação as strings utilizadas nos campos Login e Senha. Vi o vídeo e li o texto e não consigo entender a lógica utilizada para o ataque. Poderia me explicar melhor a questão das strings?
Obrigado.
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
Boa tarde, fiquei com dúvida com relação as strings utilizadas nos campos Login e Senha. Vi o vídeo e li o texto e não consigo entender a lógica utilizada para o ataque. Poderia me explicar melhor a questão das strings?
Obrigado.
Olá Kramer, tudo bom? A questão é a seguinte:
Imagine que para fazer o login, ao receber o usuário e senha do formulário o sistema precise buscar no banco de dados por um usuário com as credenciais.
O ataque se baseia em suposições:
Ao tentar fazer login com admin e uma senha qualquer, a mensagem de erro retornada foi Senha incorreta, diferente da mensagem anterior Conta inexistente. A partir disso, é possível supor que exista um usuário com nome de usuário admin.
Ao fazer queries em um banco SQL, o código segue um padrão. Uma query que busca por um usuário com nome admin em geral se assemelha a algo assim:
SELECT * FROM usuarios WHERE nome_de_usuario = 'admin' AND senha = 'hash da senha';Se o programador fez uma simples concatenação de strings no servidor, é possível injetar código. Por exemplo, se o código do servidor for algo assim.
usuarioValidoCom(nome, senha) {
usuario = fazQuery("SELECT * FROM usuarios WHERE nome_de_usuario = '" + nome + "' AND senha = '" + senha + "';");
return usuario != null;
}Repare que podemos interferir diretamente no meio da query com um nome adequado.
Se eu preencher o formulário com um nome de usuario inválido, podemos causar um erro. Se o erro não for tratado, podemos obter informações sobre o banco de dados. Ao inserir a senha ', causamos um erro de sintaxe no banco SQL, pois a query inteira fica algo que supomos ser semelhante à seguinte:
SELECT * FROM usuarios WHERE nome_de_usuario = 'admin' AND senha = '''; Repare que ao filtrar o campo senha existem agora 3 aspas, ou seja: as primeiras duas abrem e fecham uma string vazia, enquanto a segunda abre uma nova string que não é esperada. Ao encontrar essa nova abertura de string, o banco lança um erro pois o código SQL da consulta é inválido. No caso, o erro é mostrado diretamente na tela de login, dando acesso a informações sigilosas como o nome da tabela e dos campos de nome de usuário e senha reais, como na imagem da transcrição do vídeo mostra:
SELECT username FROM accounts WHERE username = 'admin' AND password = ''';Para isso, basta fazer com que a query retorne o username do usuário admin. Como já sabemos qual a query está sendo feita e conseguimos injetar o código que desejarmos, podemos manipular essa query para retornar o que queremos.
Para isso, precisamos de uma consulta que ignore a condição de senha e retorne qualquer coisa. A query que desejamos executar é a seguinte:
SELECT username FROM accounts WHERE username = 'admin' AND password = 'qualquer coisa' OR '1' = '1';Se conseguirmos executar essa query, provavelmente conseguiremos fazer login com o usuário de admin. Para isso, basta inserir a seguinte senha no campo de senha:
qualquer coisa' OR '1' = '1Por causa do modo como a query foi montada, conseguimos executar o código malicioso que queremos:
fazQuery("SELECT username FROM accounts WHERE username = '" + "admin" + "' AND password = '" + "qualquer coisa' OR '1' = '1" + "'");
// traduz para
SELECT username FROM accounts WHERE username = 'admin' AND password = 'qualquer coisa' OR '1' = '1'Deu pra entender a sequencia de suposições, testes e como foi executado o código?