MongoDB

No banco de dados não relacional MongoDB, os injections tem a mesma lógica dos banco relacionais (em termos de injections), porém com sintaxes diferentes. Por exemplo, o MySQL usa o injection ' or 1=1 -- enquanto o MongoDB usa || 1==1 ou [{"$gt":""}] que diz para nos retornar o que for maior que null, ou seja, tudo.

DICA: Podemos saber se determinado campo existe em uma Collection inserindo a condição && this.password .

Comandos Básicos

COMANDO

DESCRIÇÃO

mongo

Conecta ao banco de dados local

mongo <ip> / mongo --host <ip>

Conecta ao banco de dados remoto

show dbs

Exibe os databases. admin, config e local são utilizadas pelo próprio MongoDB

use <database>

Seleciona um database

show collections

Exibe as Collections do Database atual

db.<collection>.find()

Exibe as informações de uma determinada Collection. Por padrão exibe 20 registros, digite it para mostrar mais registros.

db.<collection>.find().count()

Exibe a quantidade de registros em uma determinada Collection

db.<collection>.find().limit(<qtdade_registros>)

Retorna uma determinada quantidade de registros

db.<collection>.find({"<key>": "<value>"})

Filtrando por campo que tenha determinado valor

db.<collection>.find({"<key>": {$gt: "<value_integer>"})

Filtrando por campo que tenha um valor maior que o determinado

db.<collection>.find({$and: [{"<key>": "<value>"}, {"<key>": "<value>"}]})

Filtrando com a condição AND

db.<collection>.find({$or: [{"<key>": "<value>"}, {"<key>": "<value>"}]})

Filtrando com a condição OR

db.<collection>.find({"<key>": {$regex: "ˆABC.*"}}) db.<collection>.find({"<key>": {$regex: "ABC.*"}}).count()

Filtra por todas os registros de determinada key que começam com "ABC"

db.<collection>.find().sort({"<key>": 1}).skip(100).limit(1)

Ordenando por determinado, exibindo a partir da linha 100 e exibindo apenas o primeiro resultado

db.<collection>.aggregate({"$group": {"_id": null, avg: {$avg: "$<key>"}}})

Exibindo média de valores

NoSQL Injection

Ao fazer um injection para trazer todos os dados, semelhante a um ' or '1'='1, primeiro manipule o campo chave via Burp Suite ou via GET (caso esteja disponível), seguindo o seguinte padrão:

Blind NoSQL

Semelhante ao processo de Blind SQL, o Blind NoSQL também e um processo manual bastante maçante. Supondo que temos uma vulnerabilidade que nos permite injectar comandos no MongoDB, podemos utilizar o seguinte payload:

Caso no retorne positivo, o sistema web irá continuar trazendo os resultados normalmente e caso negativo, não irá retorna dados quaisquer. Caso retorne ok, altere o payload para o seguinte modelo:

Depois disso continue fazendo esse processo até finalizar a string que deseja buscar.

PyMongo

Sites

Last updated

Was this helpful?