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:
.find({
usersCollectionage: {"$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.