DEV Community

Kaio Gomes
Kaio Gomes

Posted on

Básico de NoSQL Injection

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

Alt Text

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.
Alt Text

Usuário criado, se a gente for na rota de listagem de usuários veremos nosso usuário anteriormente criado lá.
Alt Text

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á.
Alt Text

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.
Alt Text

É 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)