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.