Translated ['src/pentesting-web/deserialization/nodejs-proto-prototype-p

This commit is contained in:
Translator 2025-08-19 22:04:31 +00:00
parent d74ff76051
commit 2108ba8dd9

View File

@ -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-201911358: Атака на прототипне забруднення через jQuery $ .extend ### CVE-201911358: Атака прототипного забруднення через 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-201911358, ілюструє, як глибоке копіювання може ненавмисно змінити прототип, що призводить до потенційних ризиків безпеки, таких як несанкціонований доступ адміністратора, якщо такі властивості, як `isAdmin`, перевіряються без належної перевірки існування. Ця вразливість, ідентифікована як CVE-201911358, ілюструє, як глибоке копіювання може ненавмисно змінити прототип, що призводить до потенційних ризиків безпеки, таких як несанкціонований доступ адміністратора, якщо властивості, такі як `isAdmin`, перевіряються без належної перевірки існування.
### CVE-20183721, CVE-201910744: Атака на забруднення прототипу через lodash ### CVE-20183721, CVE-201910744: Атака на забруднення прототипу через 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-20183721, CVE-201910744). Ці проблеми були вирішені в версії 4.17.11. [Lodash](https://www.npmjs.com/package/lodash) зіткнувся з подібними вразливостями забруднення прототипу (CVE-20183721, CVE-201910744). Ці проблеми були вирішені в версії 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-пакети, які можуть виявляти та запобігати атакам забруднення прототипу.