Pra início de conversa, se você tá lendo isso provavelmente já sabe o que é SQLInjection, então não será nem um pouco difícil de entender NoSQLInjection. É básicamente injeção de comandos NoSQL pra dar bypass em alguma chamada ao banco de dados e pegar dados sensíveis etc.
Eu mesmo preparei um ambiente vulnerável, aqui está o código dele
Beleza, já temos a aplicação vulnerável, vou iniciar ela e ele vai mostrar no terminal alguns avisos como Server started
e DATABASE CONNECTED BRO, IHULL!
.
Se dermos uma rápida olhada no código veremos que se trata de uma aplicação express integrada com banco de dados MongoDB, um banco NoSQL. Vemos também que há duas rotas, uma chamada /listUsers
e outra /createUser
, ambas com método post.
Vamos então criar um usuário, nada muito incomum.
Usuário criado, se a gente for na rota de listagem de usuários veremos nosso usuário anteriormente criado lá.
Okay, vemos que está funcionando perfeitamente.
Pra testar a injeção de NoSQL eu criei outro usuário com nome Pedro e senha 321 pela rota de criação de usuários e logo após fui verificar se ele estava mesmo lá.
Ok, os 2 usuários que criamos aparentemente estão lá.
Então, como a gente usaria o NoSQLInjection a nosso favor para por exemplo pegar todos os usuários do banco de dados? Bem simples, podemos usar o seguinte payload { "$gte": "" }
.
Dessa forma o banco de dados vai simplesmente achar que estamos buscando todos os usuário dessa collection.
É basicamente isso, esse é um post muito básico e introdutório. Tem muitos e muitos payloads para explorar NoSQL Injection, um lugar que eu recomendaria para procurar esses payloads é aqui: https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/NoSQL%20Injection
Artigos que podem ajudar:
https://owasp.org/www-pdf-archive/GOD16-NOSQL.pdf
https://medium.com/rangeforce/nosql-injection-6514a8db29e3
Top comments (0)