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

This commit is contained in:
Translator 2025-08-04 16:14:46 +00:00
parent 209c947c12
commit d80adaea07

View File

@ -1,12 +1,12 @@
# Пошкодження прототипу на стороні клієнта
# Client Side Prototype Pollution
{{#include ../../../banners/hacktricks-training.md}}
## Виявлення за допомогою автоматичних інструментів
Інструменти [**https://github.com/dwisiswant0/ppfuzz**](https://github.com/dwisiswant0/ppfuzz?tag=v1.0.0)**,** [**https://github.com/kleiton0x00/ppmap**](https://github.com/kleiton0x00/ppmap) **та** [**https://github.com/kosmosec/proto-find**](https://github.com/kosmosec/proto-find) можна використовувати для **виявлення вразливостей прототипного забруднення**.
Інструменти [**https://github.com/dwisiswant0/ppfuzz**](https://github.com/dwisiswant0/ppfuzz?tag=v1.0.0)**,** [**https://github.com/kleiton0x00/ppmap**](https://github.com/kleiton0x00/ppmap) **та** [**https://github.com/kosmosec/proto-find**](https://github.com/kosmosec/proto-find) можуть бути використані для **виявлення вразливостей прототипного забруднення**.
Крім того, ви також можете використовувати **розширення браузера** [**PPScan**](https://github.com/msrkp/PPScan) для **автоматичного** **сканування** **сторінок**, до яких ви **доступаєте**, на наявність вразливостей прототипного забруднення.
Крім того, ви також можете використовувати **розширення браузера** [**PPScan**](https://github.com/msrkp/PPScan) для **автоматичного** **сканування** **сторінок**, які ви **відвідуєте**, на наявність вразливостей прототипного забруднення.
### Налагодження, де використовується властивість <a href="#id-5530" id="id-5530"></a>
```javascript
@ -27,7 +27,7 @@ return "test"
1. Використовуйте інструмент для виявлення вразливості та отримайте payload, призначений для встановлення властивості в конструкторі. Приклад, наданий ppmap, може виглядати так: `constructor[prototype][ppmap]=reserved`.
2. Встановіть точку зупинки на першому рядку JavaScript-коду, який буде виконуватись на сторінці. Оновіть сторінку з payload, призупинивши виконання на цій точці зупинки.
3. Поки виконання JavaScript призупинено, виконайте наступний скрипт у консолі JS. Цей скрипт сигналізуватиме, коли властивість 'ppmap' буде створена, що допоможе в її виявленні:
3. Поки виконання JavaScript призупинено, виконайте наступний скрипт у консолі JS. Цей скрипт сигналізуватиме, коли властивість 'ppmap' буде створена, що допоможе знайти її походження:
```javascript
function debugAccess(obj, prop, debugGet = true) {
var origValue = obj[prop]
@ -48,13 +48,38 @@ debugAccess(Object.prototype, "ppmap")
```
4. Перейдіть назад на вкладку **Sources** і виберіть “Resume script execution”. JavaScript продовжить виконання, і властивість 'ppmap' буде забруднена, як і очікувалося. Використання наданого фрагмента полегшує визначення точного місця, де властивість 'ppmap' забруднена. Переглядаючи **Call Stack**, можна спостерігати різні стеки, де відбулося забруднення.
При виборі, який стек досліджувати, часто корисно націлюватися на стеки, пов'язані з файлами бібліотек JavaScript, оскільки забруднення прототипів часто відбувається в цих бібліотеках. Визначте відповідний стек, перевіривши його прив'язку до файлів бібліотек (видно з правого боку, подібно до зображення, наданого для орієнтира). У випадках з кількома стеками, такими як ті, що на рядках 4 і 6, логічним вибором є стек на рядку 4, оскільки він представляє початкове забруднення і, отже, корінь вразливості. Клікнувши на стек, ви перейдете до вразливого коду.
При виборі стека для дослідження часто корисно націлюватися на стеки, пов'язані з файлами бібліотек JavaScript, оскільки забруднення прототипів часто відбувається в цих бібліотеках. Визначте відповідний стек, перевіривши його прив'язку до файлів бібліотек (видно з правого боку, подібно до зображення, наданого для орієнтації). У випадках з кількома стеками, такими як ті, що на рядках 4 і 6, логічним вибором є стек на рядку 4, оскільки він представляє початкове забруднення і, отже, корінь вразливості. Клікнувши на стек, ви перейдете до вразливого коду.
![https://miro.medium.com/max/1400/1*S8NBOl1a7f1zhJxlh-6g4w.jpeg](https://miro.medium.com/max/1400/1*S8NBOl1a7f1zhJxlh-6g4w.jpeg)
## Знаходження скриптових гаджетів
## Пошук скриптових гаджетів
Гаджет — це **код, який буде зловживатися після виявлення вразливості PP**.
Якщо додаток простий, ми можемо **шукати** **ключові слова** такі як **`srcdoc/innerHTML/iframe/createElement`** і переглянути вихідний код, щоб перевірити, чи він **призводить до виконання javascript**. Іноді згадані техніки можуть взагалі не знайти гаджети. У такому випадку чистий перегляд вихідного коду виявляє деякі хороші гаджети, як у наведеному нижче прикладі.
### Приклад знаходження гаджета PP у коді бібліотеки Mithil
Перевірте цей звіт: [https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/](https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/)
## Перекомпіляція пейлоадів для вразливих бібліотек
- [https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#prototype-pollution](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#prototype-pollution)
- [https://github.com/BlackFan/client-side-prototype-pollution](https://github.com/BlackFan/client-side-prototype-pollution)
## Обхід HTML-санітизаторів через PP
[**Це дослідження**](https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/) показує гаджети PP, які можна використовувати для **обходу санітизацій**, наданих деякими бібліотеками HTML-санітизаторів:
- **sanitize-html**
<figure><img src="../../../images/image (1140).png" alt="https://research.securitum.com/wp-content/uploads/sites/2/2020/08/image-7.png"><figcaption></figcaption></figure>
- **dompurify**
<figure><img src="../../../images/image (1141).png" alt="https://research.securitum.com/wp-content/uploads/sites/2/2020/08/image-9.png"><figcaption></figcaption></figure>
- **Closure**
```html
<!-- from https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/ -->
<script>
@ -76,8 +101,73 @@ const node = goog.dom.safeHtmlToNode(sanitized);
document.body.append(node);
</script>
```
## Нові інструменти та автоматизація (20232025)
* **Burp Suite DOM Invader (v2023.6)** PortSwigger додав спеціальну вкладку *Prototype-pollution*, яка автоматично змінює імена параметрів (наприклад, `__proto__`, `constructor.prototype`) і виявляє забруднені властивості в точках sink всередині розширення браузера. Коли активується гаджет, DOM Invader показує стек виконання та точний рядок, де властивість була розіменована, що робить ручне полювання на точки зупинки непотрібним. Поєднайте це з фрагментом "Break on property access", вже показаним вище, щоб швидко перейти від *source → sink*.
* **protoStalker** плагін з відкритим кодом для Chrome DevTools (випущений у 2024 році), який візуалізує ланцюги прототипів в реальному часі та позначає записи в глобально небезпечні ключі, такі як `onerror`, `innerHTML`, `srcdoc`, `id` тощо. Корисно, коли у вас є лише виробничий пакет і ви не можете інструментувати етап збірки.
* **ppfuzz 2.0 (2025)** інструмент тепер підтримує ES-модулі, HTTP/2 та WebSocket кінцеві точки. Новий режим `-A browser` запускає безголовний екземпляр Chromium і автоматично перераховує класи гаджетів, брутфорсуючи DOM API (див. розділ нижче).
---
## Останні дослідження гаджетів Prototype-Pollution (20222025)
В середині 2023 року дослідники PortSwigger опублікували статтю, в якій показали, що *вбудовані в браузер* об'єкти можуть бути перетворені на надійні XSS гаджети після забруднення. Оскільки ці об'єкти присутні на **кожній** сторінці, ви можете отримати виконання, навіть якщо код цільового застосунку ніколи не торкається забрудненої властивості.
Приклад гаджета (працює у всіх evergreen браузерах ≥ 2023-04):
```html
<script>
// Source (e.g. https://victim/?__proto__[href]=javascript:alert(document.domain))
// For demo we just pollute manually:
Object.prototype.href = 'javascript:alert(`polluted`)' ;
// Sink URL() constructor implicitly reads `href`
new URL('#'); // breaks into JS; in Chrome you get an alert, Firefox loads "javascript:" URL
</script>
```
Інші корисні глобальні гаджети, які підтверджено працюють після забруднення (тестування 2024-11):
| Клас гаджета | Читати властивість | Досягнутий примітив |
|--------------|--------------------|---------------------|
| `Notification` | `title` | `alert()` через клік на сповіщення |
| `Worker` | `name` | Виконання JS у виділеному Worker |
| `Image` | `src` | Традиційний `onerror` XSS |
| `URLSearchParams` | `toString` | DOM-орієнтований Open Redirect |
Дивіться статтю PortSwigger для повного списку з 11 гаджетів та обговорення про втечі з пісочниці.
---
## Помітні CVE PP на стороні клієнта (2023-2025)
* **DOMPurify ≤ 3.0.8 CVE-2024-45801** Зловмисник міг забруднити `Node.prototype.after` до ініціалізації санітайзера, обминаючи профіль *SAFE_FOR_TEMPLATES* і призводячи до збереженого XSS. Постачальник виправив це, використовуючи перевірки `Object.hasOwn()` та `Object.create(null)` для внутрішніх карт.
* **jQuery 3.6.0-3.6.3 CVE-2023-26136 / CVE-2023-26140** `extend()` міг бути використаний на створених об'єктах, що походять з `location.hash`, вводячи довільні властивості в `Object.prototype` у контексті перегляду.
* **sanitize-html < 2.8.1 (2023-10) забруднення прототипу** Зловмисний список атрибутів, такий як `{"__proto__":{"innerHTML":"<img/src/onerror=alert(1)>"}}`, обійшов дозволений список.
Навіть якщо вразлива бібліотека існує **тільки на клієнті**, отриманий XSS все ще може бути експлуатований віддалено через відображені параметри, обробники postMessage або збережені дані, які відображаються пізніше.
---
## Сучасні заходи захисту
1. **Заморозьте глобальний прототип рано** (ідеально як перший скрипт):
```javascript
Object.freeze(Object.prototype);
Object.freeze(Array.prototype);
Object.freeze(Map.prototype);
```
Зверніть увагу, що це може зламати поліфіли, які покладаються на пізнє розширення.
2. Використовуйте `structuredClone()` замість `JSON.parse(JSON.stringify(obj))` або спільноти "deepMerge" фрагменти він ігнорує сеттери/геттери і не проходить по ланцюгу прототипів.
3. Коли вам дійсно потрібна функціональність глибокого злиття, виберіть **lodash ≥ 4.17.22** або **deepmerge ≥ 5.3.0**, які мають вбудовану санітарію прототипів.
4. Додайте Content-Security-Policy з `script-src 'self'` та строгим nonce. Хоча CSP не зупинить всі гаджети (наприклад, маніпуляцію з `location`), він блокує більшість "впадин" `innerHTML`.
## Посилання
- [https://infosecwriteups.com/hunting-for-prototype-pollution-and-its-vulnerable-code-on-js-libraries-5bab2d6dc746](https://infosecwriteups.com/hunting-for-prototype-pollution-and-its-vulnerable-code-on-js-libraries-5bab2d6dc746)
- [https://blog.s1r1us.ninja/research/PP](https://blog.s1r1us.ninja/research/PP)
- [https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/#:\~:text=my%20challenge.-,Closure,-Closure%20Sanitizer%20has](https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/)
- [https://portswigger.net/research/widespread-prototype-pollution-gadgets](https://portswigger.net/research/widespread-prototype-pollution-gadgets)
- [https://snyk.io/blog/dompurify-prototype-pollution-bypass-cve-2024-45801/](https://snyk.io/blog/dompurify-prototype-pollution-bypass-cve-2024-45801/)
- [https://infosecwriteups.com/hunting-for-prototype-pollution-and-its-vulnerable-code-on-js-libraries-5bab2d6dc746](https://infosecwriteups.com/hunting-for-prototype-pollution-and-its-vulnerable-code-on-js-libraries-5bab2d6dc746)
- [https://blog.s1r1us.ninja/research/PP](https://blog.s1r1us.ninja/research/PP)
- [https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/#:\~:text=my%20challenge.-,Closure,-Closure%20Sanitizer%20has](https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/)