diff --git a/src/pentesting-web/deserialization/nodejs-proto-prototype-pollution/README.md b/src/pentesting-web/deserialization/nodejs-proto-prototype-pollution/README.md index 80393fdc9..badbcb755 100644 --- a/src/pentesting-web/deserialization/nodejs-proto-prototype-pollution/README.md +++ b/src/pentesting-web/deserialization/nodejs-proto-prototype-pollution/README.md @@ -1,15 +1,15 @@ -# NodeJS - \_\_proto\_\_ та забруднення прототипу +# NodeJS - \_\_proto\_\_ & prototype Pollution {{#include ../../../banners/hacktricks-training.md}} ## Об'єкти в JavaScript -Об'єкти в JavaScript по суті є колекціями пар ключ-значення, відомими як властивості. Об'єкт можна створити за допомогою `Object.create` з `null` як аргументом, щоб отримати порожній об'єкт. Цей метод дозволяє створити об'єкт без будь-яких успадкованих властивостей. +Об'єкти в JavaScript є, по суті, колекціями пар ключ-значення, відомими як властивості. Об'єкт можна створити за допомогою `Object.create` з `null` як аргументом, щоб отримати порожній об'єкт. Цей метод дозволяє створити об'єкт без будь-яких успадкованих властивостей. ```javascript // Run this in the developers tools console console.log(Object.create(null)) // This will output an empty object. ``` -Порожній об'єкт подібний до порожнього словника, який представлений як `{}`. +Порожній об'єкт подібний до порожнього словника, представлений як `{}`. ### Функції та класи в JavaScript @@ -41,7 +41,7 @@ JavaScript дозволяє модифікацію, додавання або в У програмуванні на основі прототипів властивості/методи успадковуються об'єктами від класів. Ці класи створюються шляхом додавання властивостей/методів або до екземпляра іншого класу, або до порожнього об'єкта. -Слід зазначити, що коли властивість додається до об'єкта, який слугує прототипом для інших об'єктів (таких як `myPersonObj`), успадковуючі об'єкти отримують доступ до цієї нової властивості. Однак ця властивість не відображається автоматично, якщо її не викликати явно. +Слід зазначити, що коли властивість додається до об'єкта, що служить прототипом для інших об'єктів (таких як `myPersonObj`), успадковуючі об'єкти отримують доступ до цієї нової властивості. Однак ця властивість не відображається автоматично, якщо її не викликати явно. ## \_\_proto\_\_ забруднення @@ -56,7 +56,7 @@ this.model = model } var car1 = new Vehicle("Tesla Model S") ``` -Доступ до прототипу об'єкта можливий через: +Доступ до прототипу Object можливий через: ```javascript car1.__proto__.__proto__ Vehicle.__proto__.__proto__ @@ -78,7 +78,7 @@ console.log(car1.isVehicle) // Outputs true ``` ## prototype pollution -У сценарії, де використання `__proto__` обмежене, модифікація прототипу функції є альтернативою: +У сценарії, де використання `__proto__` обмежено, модифікація прототипу функції є альтернативою: ```javascript function Vehicle(model) { this.model = model @@ -121,7 +121,7 @@ console.log("Hello!") ### Від класу до Object.prototype -У сценарії, де ви можете **забруднити конкретний об'єкт** і вам потрібно **достукатися до `Object.prototype`**, ви можете шукати його за допомогою чогось на кшталт наступного коду: +У сценарії, де ви можете **забруднити конкретний об'єкт** і вам потрібно **достукатися до `Object.prototype`**, ви можете шукати його за допомогою чогось на зразок наступного коду: ```javascript // 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 c = [1, 2] a = [] @@ -154,9 +154,9 @@ b[0] //undefined b[1] //"yolo" 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 // Create element devSettings["root"] = document.createElement('main') @@ -183,7 +183,7 @@ Object.prototype.isAdmin = true let user = {} user.isAdmin // true ``` -Механізм, що стоїть за цим, полягає в маніпулюванні властивостями так, що якщо зловмисник контролює певні вхідні дані, він може змінити прототип усіх об'єктів в додатку. Ця маніпуляція зазвичай включає встановлення властивості `__proto__`, яка в JavaScript є синонімом безпосередньої зміни прототипу об'єкта. +Механізм, що стоїть за цим, полягає в маніпуляції властивостями так, що якщо зловмисник має контроль над певними вхідними даними, він може змінити прототип усіх об'єктів в додатку. Ця маніпуляція зазвичай включає встановлення властивості `__proto__`, яка в JavaScript є синонімом безпосередньої зміни прототипу об'єкта. Умови, за яких ця атака може бути успішно виконана, як зазначено в конкретному [дослідженні](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 customer.__proto__.toString = ()=>{alert("polluted")} ``` -### Proto Pollution to RCE +### Прототипне забруднення до RCE {{#ref}} prototype-pollution-to-rce.md {{#endref}} -Інші payloads: +Інші пейлоади: - [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}} client-side-prototype-pollution.md {{#endref}} -### CVE-2019–11358: Атака на прототипне забруднення через jQuery $ .extend +### CVE-2019–11358: Атака прототипного забруднення через jQuery $ .extend [Для отримання додаткової інформації перегляньте цю статтю](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7) У jQuery функція `$ .extend` може призвести до прототипного забруднення, якщо функцію глибокого копіювання використовувати неправильно. Ця функція зазвичай використовується для клонування об'єктів або об'єднання властивостей з об'єкта за замовчуванням. Однак, при неправильній конфігурації, властивості, призначені для нового об'єкта, можуть бути призначені прототипу замість цього. Наприклад: ```javascript $.extend(true, {}, JSON.parse('{"__proto__": {"devMode": true}}')) console.log({}.devMode) // Outputs: true ``` -Ця вразливість, ідентифікована як CVE-2019–11358, ілюструє, як глибоке копіювання може ненавмисно змінити прототип, що призводить до потенційних ризиків безпеки, таких як несанкціонований доступ адміністратора, якщо такі властивості, як `isAdmin`, перевіряються без належної перевірки існування. +Ця вразливість, ідентифікована як CVE-2019–11358, ілюструє, як глибоке копіювання може ненавмисно змінити прототип, що призводить до потенційних ризиків безпеки, таких як несанкціонований доступ адміністратора, якщо властивості, такі як `isAdmin`, перевіряються без належної перевірки існування. ### 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. ### Інший посібник з CVE -{{#ref}} -https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2 -{{#endref}} + +- [https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2](https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2) + ### Інструменти для виявлення забруднення прототипу @@ -239,15 +239,15 @@ https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-a ### AST Забруднення прототипу в NodeJS -NodeJS широко використовує абстрактні синтаксичні дерева (AST) в JavaScript для функцій, таких як шаблонні двигуни та TypeScript. Цей розділ досліджує вразливості, пов'язані із забрудненням прототипу в шаблонних двигунах, зокрема Handlebars і Pug. +NodeJS широко використовує Абстрактні Синтаксичні Дерева (AST) в JavaScript для функціональностей, таких як шаблонні двигуни та TypeScript. Цей розділ досліджує вразливості, пов'язані із забрудненням прототипу в шаблонних двигунах, зокрема Handlebars і Pug. #### Аналіз вразливості 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`, вимагає, щоб значення були числовими. Забруднення прототипу може обійти це, дозволяючи вставку нечислових рядків. 2. **Обробка компілятором**: Компілятор може обробляти об'єкт AST або шаблон рядка. Якщо `input.type` дорівнює `Program`, вхідні дані обробляються як попередньо розібрані, що може бути використано в експлуатації. @@ -315,7 +315,7 @@ requests.get(TARGET_URL) ``` #### Уразливість 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: ```python @@ -343,10 +343,10 @@ requests.get(TARGET_URL) 3. **Безпечні функції злиття**: Слід уникати небезпечного використання рекурсивних функцій злиття. 4. **Об'єкти без прототипу**: Об'єкти без властивостей прототипу можна створити за допомогою `Object.create(null)`. 5. **Використання Map**: Замість `Object` слід використовувати `Map` для зберігання пар ключ-значення. -6. **Оновлення бібліотек**: Безпекові патчі можна впроваджувати шляхом регулярного оновлення бібліотек. -7. **Інструменти лінтингу та статичного аналізу**: Використовуйте інструменти, такі як ESLint з відповідними плагінами, для виявлення та запобігання вразливостям, пов'язаним із забрудненням прототипу. -8. **Огляди коду**: Реалізуйте ретельні огляди коду для виявлення та усунення потенційних ризиків, пов'язаних із забрудненням прототипу. -9. **Навчання з безпеки**: Освіжайте розробників про ризики забруднення прототипу та найкращі практики написання безпечного коду. +6. **Оновлення бібліотек**: Безпекові патчі можна впроваджувати, регулярно оновлюючи бібліотеки. +7. **Інструменти для лінтингу та статичного аналізу**: Використовуйте інструменти, такі як ESLint з відповідними плагінами, для виявлення та запобігання вразливостям, пов'язаним із забрудненням прототипу. +8. **Огляди коду**: Реалізуйте ретельні огляди коду, щоб виявити та усунути потенційні ризики, пов'язані із забрудненням прототипу. +9. **Навчання з безпеки**: Освітіть розробників про ризики забруднення прототипу та найкращі практики написання безпечного коду. 10. **Обережне використання бібліотек**: Будьте обережні при використанні сторонніх бібліотек. Оцініть їх безпекову позицію та перегляньте їх код, особливо ті, що маніпулюють об'єктами. 11. **Захист під час виконання**: Використовуйте механізми захисту під час виконання, такі як безпеково орієнтовані npm-пакети, які можуть виявляти та запобігати атакам забруднення прототипу.