mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/deserialization/nodejs-proto-prototype-p
This commit is contained in:
parent
d74ff76051
commit
2108ba8dd9
@ -1,15 +1,15 @@
|
|||||||
# NodeJS - \_\_proto\_\_ та забруднення прототипу
|
# NodeJS - \_\_proto\_\_ & prototype Pollution
|
||||||
|
|
||||||
{{#include ../../../banners/hacktricks-training.md}}
|
{{#include ../../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## Об'єкти в JavaScript <a href="#id-053a" id="id-053a"></a>
|
## Об'єкти в JavaScript <a href="#id-053a" id="id-053a"></a>
|
||||||
|
|
||||||
Об'єкти в JavaScript по суті є колекціями пар ключ-значення, відомими як властивості. Об'єкт можна створити за допомогою `Object.create` з `null` як аргументом, щоб отримати порожній об'єкт. Цей метод дозволяє створити об'єкт без будь-яких успадкованих властивостей.
|
Об'єкти в JavaScript є, по суті, колекціями пар ключ-значення, відомими як властивості. Об'єкт можна створити за допомогою `Object.create` з `null` як аргументом, щоб отримати порожній об'єкт. Цей метод дозволяє створити об'єкт без будь-яких успадкованих властивостей.
|
||||||
```javascript
|
```javascript
|
||||||
// Run this in the developers tools console
|
// Run this in the developers tools console
|
||||||
console.log(Object.create(null)) // This will output an empty object.
|
console.log(Object.create(null)) // This will output an empty object.
|
||||||
```
|
```
|
||||||
Порожній об'єкт подібний до порожнього словника, який представлений як `{}`.
|
Порожній об'єкт подібний до порожнього словника, представлений як `{}`.
|
||||||
|
|
||||||
### Функції та класи в JavaScript
|
### Функції та класи в JavaScript
|
||||||
|
|
||||||
@ -41,7 +41,7 @@ JavaScript дозволяє модифікацію, додавання або в
|
|||||||
|
|
||||||
У програмуванні на основі прототипів властивості/методи успадковуються об'єктами від класів. Ці класи створюються шляхом додавання властивостей/методів або до екземпляра іншого класу, або до порожнього об'єкта.
|
У програмуванні на основі прототипів властивості/методи успадковуються об'єктами від класів. Ці класи створюються шляхом додавання властивостей/методів або до екземпляра іншого класу, або до порожнього об'єкта.
|
||||||
|
|
||||||
Слід зазначити, що коли властивість додається до об'єкта, який слугує прототипом для інших об'єктів (таких як `myPersonObj`), успадковуючі об'єкти отримують доступ до цієї нової властивості. Однак ця властивість не відображається автоматично, якщо її не викликати явно.
|
Слід зазначити, що коли властивість додається до об'єкта, що служить прототипом для інших об'єктів (таких як `myPersonObj`), успадковуючі об'єкти отримують доступ до цієї нової властивості. Однак ця властивість не відображається автоматично, якщо її не викликати явно.
|
||||||
|
|
||||||
## \_\_proto\_\_ забруднення <a href="#id-0d0a" id="id-0d0a"></a>
|
## \_\_proto\_\_ забруднення <a href="#id-0d0a" id="id-0d0a"></a>
|
||||||
|
|
||||||
@ -56,7 +56,7 @@ this.model = model
|
|||||||
}
|
}
|
||||||
var car1 = new Vehicle("Tesla Model S")
|
var car1 = new Vehicle("Tesla Model S")
|
||||||
```
|
```
|
||||||
Доступ до прототипу об'єкта можливий через:
|
Доступ до прототипу Object можливий через:
|
||||||
```javascript
|
```javascript
|
||||||
car1.__proto__.__proto__
|
car1.__proto__.__proto__
|
||||||
Vehicle.__proto__.__proto__
|
Vehicle.__proto__.__proto__
|
||||||
@ -78,7 +78,7 @@ console.log(car1.isVehicle) // Outputs true
|
|||||||
```
|
```
|
||||||
## prototype pollution
|
## prototype pollution
|
||||||
|
|
||||||
У сценарії, де використання `__proto__` обмежене, модифікація прототипу функції є альтернативою:
|
У сценарії, де використання `__proto__` обмежено, модифікація прототипу функції є альтернативою:
|
||||||
```javascript
|
```javascript
|
||||||
function Vehicle(model) {
|
function Vehicle(model) {
|
||||||
this.model = model
|
this.model = model
|
||||||
@ -121,7 +121,7 @@ console.log("Hello!")
|
|||||||
|
|
||||||
### Від класу до Object.prototype
|
### Від класу до Object.prototype
|
||||||
|
|
||||||
У сценарії, де ви можете **забруднити конкретний об'єкт** і вам потрібно **достукатися до `Object.prototype`**, ви можете шукати його за допомогою чогось на кшталт наступного коду:
|
У сценарії, де ви можете **забруднити конкретний об'єкт** і вам потрібно **достукатися до `Object.prototype`**, ви можете шукати його за допомогою чогось на зразок наступного коду:
|
||||||
```javascript
|
```javascript
|
||||||
// From https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/
|
// From https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/
|
||||||
|
|
||||||
@ -144,7 +144,7 @@ console.log(key1 + "." + key2)
|
|||||||
```
|
```
|
||||||
### Забруднення елементів масиву
|
### Забруднення елементів масиву
|
||||||
|
|
||||||
Зверніть увагу, що оскільки ви можете забруднювати атрибути об'єктів у JS, якщо у вас є доступ до забруднення масиву, ви також можете **забруднювати значення масиву**, доступні **за індексами** (зверніть увагу, що ви не можете перезаписувати значення, тому вам потрібно забруднити індекси, які якимось чином використовуються, але не записуються).
|
Зверніть увагу, що оскільки ви можете забруднювати атрибути об'єктів у JS, якщо у вас є доступ до забруднення масиву, ви також можете **забруднювати значення масиву**, доступні **за індексами** (зверніть увагу, що ви не можете перезаписувати значення, тому вам потрібно забруднювати індекси, які якимось чином використовуються, але не записуються).
|
||||||
```javascript
|
```javascript
|
||||||
c = [1, 2]
|
c = [1, 2]
|
||||||
a = []
|
a = []
|
||||||
@ -154,9 +154,9 @@ b[0] //undefined
|
|||||||
b[1] //"yolo"
|
b[1] //"yolo"
|
||||||
c[1] // 2 -- not
|
c[1] // 2 -- not
|
||||||
```
|
```
|
||||||
### Забруднення HTML елементів
|
### Html elements pollution
|
||||||
|
|
||||||
Коли генерується HTML елемент за допомогою JS, можливо **перезаписати** атрибут **`innerHTML`**, щоб він записував **произвольний HTML код.** [Idea and example from this writeup](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/).
|
Коли генерується HTML-елемент за допомогою JS, можливо **перезаписати** атрибут **`innerHTML`**, щоб він записував **произвольний HTML-код.** [Idea and example from this writeup](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/).
|
||||||
```javascript
|
```javascript
|
||||||
// Create element
|
// Create element
|
||||||
devSettings["root"] = document.createElement('main')
|
devSettings["root"] = document.createElement('main')
|
||||||
@ -183,7 +183,7 @@ Object.prototype.isAdmin = true
|
|||||||
let user = {}
|
let user = {}
|
||||||
user.isAdmin // true
|
user.isAdmin // true
|
||||||
```
|
```
|
||||||
Механізм, що стоїть за цим, полягає в маніпулюванні властивостями так, що якщо зловмисник контролює певні вхідні дані, він може змінити прототип усіх об'єктів в додатку. Ця маніпуляція зазвичай включає встановлення властивості `__proto__`, яка в JavaScript є синонімом безпосередньої зміни прототипу об'єкта.
|
Механізм, що стоїть за цим, полягає в маніпуляції властивостями так, що якщо зловмисник має контроль над певними вхідними даними, він може змінити прототип усіх об'єктів в додатку. Ця маніпуляція зазвичай включає встановлення властивості `__proto__`, яка в JavaScript є синонімом безпосередньої зміни прототипу об'єкта.
|
||||||
|
|
||||||
Умови, за яких ця атака може бути успішно виконана, як зазначено в конкретному [дослідженні](https://github.com/HoLyVieR/prototype-pollution-nsec18/blob/master/paper/JavaScript_prototype_pollution_attack_in_NodeJS.pdf), включають:
|
Умови, за яких ця атака може бути успішно виконана, як зазначено в конкретному [дослідженні](https://github.com/HoLyVieR/prototype-pollution-nsec18/blob/master/paper/JavaScript_prototype_pollution_attack_in_NodeJS.pdf), включають:
|
||||||
|
|
||||||
@ -195,42 +195,42 @@ user.isAdmin // true
|
|||||||
```python
|
```python
|
||||||
customer.__proto__.toString = ()=>{alert("polluted")}
|
customer.__proto__.toString = ()=>{alert("polluted")}
|
||||||
```
|
```
|
||||||
### Proto Pollution to RCE
|
### Прототипне забруднення до RCE
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
prototype-pollution-to-rce.md
|
prototype-pollution-to-rce.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
Інші payloads:
|
Інші пейлоади:
|
||||||
|
|
||||||
- [https://github.com/KTH-LangSec/server-side-prototype-pollution](https://github.com/KTH-LangSec/server-side-prototype-pollution)
|
- [https://github.com/KTH-LangSec/server-side-prototype-pollution](https://github.com/KTH-LangSec/server-side-prototype-pollution)
|
||||||
|
|
||||||
## Client-side prototype pollution to XSS
|
## Забруднення прототипу на стороні клієнта до XSS
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
client-side-prototype-pollution.md
|
client-side-prototype-pollution.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### CVE-2019–11358: Атака на прототипне забруднення через jQuery $ .extend
|
### CVE-2019–11358: Атака прототипного забруднення через jQuery $ .extend
|
||||||
|
|
||||||
[Для отримання додаткової інформації перегляньте цю статтю](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7) У jQuery функція `$ .extend` може призвести до прототипного забруднення, якщо функцію глибокого копіювання використовувати неправильно. Ця функція зазвичай використовується для клонування об'єктів або об'єднання властивостей з об'єкта за замовчуванням. Однак, при неправильній конфігурації, властивості, призначені для нового об'єкта, можуть бути призначені прототипу замість цього. Наприклад:
|
[Для отримання додаткової інформації перегляньте цю статтю](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7) У jQuery функція `$ .extend` може призвести до прототипного забруднення, якщо функцію глибокого копіювання використовувати неправильно. Ця функція зазвичай використовується для клонування об'єктів або об'єднання властивостей з об'єкта за замовчуванням. Однак, при неправильній конфігурації, властивості, призначені для нового об'єкта, можуть бути призначені прототипу замість цього. Наприклад:
|
||||||
```javascript
|
```javascript
|
||||||
$.extend(true, {}, JSON.parse('{"__proto__": {"devMode": true}}'))
|
$.extend(true, {}, JSON.parse('{"__proto__": {"devMode": true}}'))
|
||||||
console.log({}.devMode) // Outputs: true
|
console.log({}.devMode) // Outputs: true
|
||||||
```
|
```
|
||||||
Ця вразливість, ідентифікована як CVE-2019–11358, ілюструє, як глибоке копіювання може ненавмисно змінити прототип, що призводить до потенційних ризиків безпеки, таких як несанкціонований доступ адміністратора, якщо такі властивості, як `isAdmin`, перевіряються без належної перевірки існування.
|
Ця вразливість, ідентифікована як CVE-2019–11358, ілюструє, як глибоке копіювання може ненавмисно змінити прототип, що призводить до потенційних ризиків безпеки, таких як несанкціонований доступ адміністратора, якщо властивості, такі як `isAdmin`, перевіряються без належної перевірки існування.
|
||||||
|
|
||||||
### CVE-2018–3721, CVE-2019–10744: Атака на забруднення прототипу через lodash
|
### CVE-2018–3721, CVE-2019–10744: Атака на забруднення прототипу через lodash
|
||||||
|
|
||||||
[Для отримання додаткової інформації перегляньте цю статтю](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7)
|
[Для отримання додаткових деталей перегляньте цю статтю](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7)
|
||||||
|
|
||||||
[Lodash](https://www.npmjs.com/package/lodash) зіткнувся з подібними вразливостями забруднення прототипу (CVE-2018–3721, CVE-2019–10744). Ці проблеми були вирішені в версії 4.17.11.
|
[Lodash](https://www.npmjs.com/package/lodash) зіткнувся з подібними вразливостями забруднення прототипу (CVE-2018–3721, CVE-2019–10744). Ці проблеми були вирішені в версії 4.17.11.
|
||||||
|
|
||||||
### Інший посібник з CVE
|
### Інший посібник з CVE
|
||||||
|
|
||||||
{{#ref}}
|
|
||||||
https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2
|
- [https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2](https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2)
|
||||||
{{#endref}}
|
|
||||||
|
|
||||||
### Інструменти для виявлення забруднення прототипу
|
### Інструменти для виявлення забруднення прототипу
|
||||||
|
|
||||||
@ -239,15 +239,15 @@ https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-a
|
|||||||
|
|
||||||
### AST Забруднення прототипу в NodeJS
|
### AST Забруднення прототипу в NodeJS
|
||||||
|
|
||||||
NodeJS широко використовує абстрактні синтаксичні дерева (AST) в JavaScript для функцій, таких як шаблонні двигуни та TypeScript. Цей розділ досліджує вразливості, пов'язані із забрудненням прототипу в шаблонних двигунах, зокрема Handlebars і Pug.
|
NodeJS широко використовує Абстрактні Синтаксичні Дерева (AST) в JavaScript для функціональностей, таких як шаблонні двигуни та TypeScript. Цей розділ досліджує вразливості, пов'язані із забрудненням прототипу в шаблонних двигунах, зокрема Handlebars і Pug.
|
||||||
|
|
||||||
#### Аналіз вразливості Handlebars
|
#### Аналіз вразливості Handlebars
|
||||||
|
|
||||||
Шаблонний двигун Handlebars вразливий до атаки на забруднення прототипу. Ця вразливість виникає через специфічні функції в файлі `javascript-compiler.js`. Функція `appendContent`, наприклад, конкатенує `pendingContent`, якщо він присутній, тоді як функція `pushSource` скидає `pendingContent` на `undefined` після додавання джерела.
|
Шаблонний двигун Handlebars вразливий до атаки забруднення прототипу. Ця вразливість виникає з конкретних функцій у файлі `javascript-compiler.js`. Функція `appendContent`, наприклад, конкатенує `pendingContent`, якщо він присутній, тоді як функція `pushSource` скидає `pendingContent` на `undefined` після додавання джерела.
|
||||||
|
|
||||||
**Процес експлуатації**
|
**Процес експлуатації**
|
||||||
|
|
||||||
Експлуатація використовує AST (абстрактне синтаксичне дерево), створене Handlebars, дотримуючись цих кроків:
|
Експлуатація використовує AST (Абстрактне Синтаксичне Дерево), створене Handlebars, дотримуючись цих кроків:
|
||||||
|
|
||||||
1. **Маніпуляція парсером**: Спочатку парсер, через вузол `NumberLiteral`, вимагає, щоб значення були числовими. Забруднення прототипу може обійти це, дозволяючи вставку нечислових рядків.
|
1. **Маніпуляція парсером**: Спочатку парсер, через вузол `NumberLiteral`, вимагає, щоб значення були числовими. Забруднення прототипу може обійти це, дозволяючи вставку нечислових рядків.
|
||||||
2. **Обробка компілятором**: Компілятор може обробляти об'єкт AST або шаблон рядка. Якщо `input.type` дорівнює `Program`, вхідні дані обробляються як попередньо розібрані, що може бути використано в експлуатації.
|
2. **Обробка компілятором**: Компілятор може обробляти об'єкт AST або шаблон рядка. Якщо `input.type` дорівнює `Program`, вхідні дані обробляються як попередньо розібрані, що може бути використано в експлуатації.
|
||||||
@ -315,7 +315,7 @@ requests.get(TARGET_URL)
|
|||||||
```
|
```
|
||||||
#### Уразливість Pug
|
#### Уразливість Pug
|
||||||
|
|
||||||
Pug, ще один движок шаблонів, стикається з подібним ризиком забруднення прототипу. Детальна інформація доступна в обговоренні про [AST Injection in Pug](https://blog.p6.is/AST-Injection/#Pug).
|
Pug, ще один движок шаблонів, стикається з подібним ризиком забруднення прототипу. Детальна інформація доступна в обговоренні на тему [AST Injection in Pug](https://blog.p6.is/AST-Injection/#Pug).
|
||||||
|
|
||||||
Приклад забруднення прототипу в Pug:
|
Приклад забруднення прототипу в Pug:
|
||||||
```python
|
```python
|
||||||
@ -343,10 +343,10 @@ requests.get(TARGET_URL)
|
|||||||
3. **Безпечні функції злиття**: Слід уникати небезпечного використання рекурсивних функцій злиття.
|
3. **Безпечні функції злиття**: Слід уникати небезпечного використання рекурсивних функцій злиття.
|
||||||
4. **Об'єкти без прототипу**: Об'єкти без властивостей прототипу можна створити за допомогою `Object.create(null)`.
|
4. **Об'єкти без прототипу**: Об'єкти без властивостей прототипу можна створити за допомогою `Object.create(null)`.
|
||||||
5. **Використання Map**: Замість `Object` слід використовувати `Map` для зберігання пар ключ-значення.
|
5. **Використання Map**: Замість `Object` слід використовувати `Map` для зберігання пар ключ-значення.
|
||||||
6. **Оновлення бібліотек**: Безпекові патчі можна впроваджувати шляхом регулярного оновлення бібліотек.
|
6. **Оновлення бібліотек**: Безпекові патчі можна впроваджувати, регулярно оновлюючи бібліотеки.
|
||||||
7. **Інструменти лінтингу та статичного аналізу**: Використовуйте інструменти, такі як ESLint з відповідними плагінами, для виявлення та запобігання вразливостям, пов'язаним із забрудненням прототипу.
|
7. **Інструменти для лінтингу та статичного аналізу**: Використовуйте інструменти, такі як ESLint з відповідними плагінами, для виявлення та запобігання вразливостям, пов'язаним із забрудненням прототипу.
|
||||||
8. **Огляди коду**: Реалізуйте ретельні огляди коду для виявлення та усунення потенційних ризиків, пов'язаних із забрудненням прототипу.
|
8. **Огляди коду**: Реалізуйте ретельні огляди коду, щоб виявити та усунути потенційні ризики, пов'язані із забрудненням прототипу.
|
||||||
9. **Навчання з безпеки**: Освіжайте розробників про ризики забруднення прототипу та найкращі практики написання безпечного коду.
|
9. **Навчання з безпеки**: Освітіть розробників про ризики забруднення прототипу та найкращі практики написання безпечного коду.
|
||||||
10. **Обережне використання бібліотек**: Будьте обережні при використанні сторонніх бібліотек. Оцініть їх безпекову позицію та перегляньте їх код, особливо ті, що маніпулюють об'єктами.
|
10. **Обережне використання бібліотек**: Будьте обережні при використанні сторонніх бібліотек. Оцініть їх безпекову позицію та перегляньте їх код, особливо ті, що маніпулюють об'єктами.
|
||||||
11. **Захист під час виконання**: Використовуйте механізми захисту під час виконання, такі як безпеково орієнтовані npm-пакети, які можуть виявляти та запобігати атакам забруднення прототипу.
|
11. **Захист під час виконання**: Використовуйте механізми захисту під час виконання, такі як безпеково орієнтовані npm-пакети, які можуть виявляти та запобігати атакам забруднення прототипу.
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user