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
209c947c12
commit
d80adaea07
@ -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, оскільки він представляє початкове забруднення і, отже, корінь вразливості. Клікнувши на стек, ви перейдете до вразливого коду.
|
||||
|
||||

|
||||
|
||||
## Знаходження скриптових гаджетів
|
||||
## Пошук скриптових гаджетів
|
||||
|
||||
Гаджет — це **код, який буде зловживатися після виявлення вразливості 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>
|
||||
```
|
||||
## Нові інструменти та автоматизація (2023–2025)
|
||||
|
||||
* **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 (2022–2025)
|
||||
|
||||
В середині 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/)
|
||||
|
Loading…
x
Reference in New Issue
Block a user