Solução
| Nome | Valor |
|---|---|
| Vulnerabilidade | NoSQL Injection |
| CWE | CWE-943 |
| OWASP Top Ten | A03_2021-Injection |
A aplicação desse exercício usa o MongoDB como banco de dados, que é um banco de dados NoSQL. Em bancos de dados relacionais estamos acostumados com SQL e vulnerabilidades como SQL Injection.
Embora MongoDB não use SQL, ainda sim é possível fazer um injection pois ele faz queries usando operadores. Uma injection assim é conhecida como NoSQL Injection.
Para usar um operador com MongoDB ao fazer a busca por um dado, basta passar um objeto ao invés de um valor (string, número etc.) para comparação com um campo. Exemplo:
usersCollection.find({
age: {"$gt": 18}
});Isso basicamente busca por todos os usuários nessa
coleção que tenham o campo age com valor maior
que 18.
Ou seja, no endpoint de login, se passarmos um objeto no lugar da senha poderemos usar operadores do MongoDB e, com isso, fazer bypass da autenticação. Exemplo:
$ curl \
--data '{"username": "admin", "password": {"$ne": 0}}' \
http://127.0.0.1:3000/users/login
Isso nos permitiria fazer login no usuário pois a senha
foi comparada com o operador $ne (not
equal).
Altere o código desse exercício para mitigar a vulnerabilidade.