Translated ['src/pentesting-web/xss-cross-site-scripting/dom-invader.md'

This commit is contained in:
Translator 2025-08-05 00:34:49 +00:00
parent be6410a10f
commit cd3ae71a7c

View File

@ -4,80 +4,127 @@
## DOM Invader
DOM Invader - це інструмент браузера, встановлений у вбудованому браузері Burp. Він допомагає у **виявленні вразливостей DOM XSS** за допомогою різних джерел і стоків, включаючи веб-повідомлення та забруднення прототипу. Інструмент попередньо встановлений як розширення.
DOM Invader - це інструмент браузера, встановлений у **вбудованому браузері Chromium Burp Suite**. Він допомагає у **виявленні DOM XSS та інших вразливостей на стороні клієнта** (забруднення прототипу, DOM clobbering тощо) шляхом автоматичного **інструментування JavaScript джерел і приймачів**. Розширення постачається з Burp і потребує лише активації.
DOM Invader інтегрує вкладку у панелі DevTools браузера, що дозволяє наступне:
DOM Invader додає вкладку до панелі DevTools браузера, яка дозволяє вам:
1. **Ідентифікація контрольованих стоків** на веб-сторінці для тестування DOM XSS, надаючи контекст та деталі санітизації.
2. **Логування, редагування та повторна відправка веб-повідомлень**, надісланих за допомогою методу `postMessage()` для тестування DOM XSS. DOM Invader також може автоматично виявляти вразливості, використовуючи спеціально підготовлені веб-повідомлення.
3. Виявлення **джерел забруднення прототипу на стороні клієнта** та сканування контрольованих гаджетів, надісланих до ризикованих стоків.
4. Ідентифікація **вразливостей DOM clobbering**.
1. **Визначати контрольовані приймачі** в реальному часі, включаючи контекст (атрибут, HTML, URL, JS) та застосовану санітизацію.
2. **Логувати, редагувати та повторно надсилати `postMessage()` веб-повідомлення**, або дозволити розширенню автоматично їх змінювати.
3. **Виявляти джерела забруднення прототипу на стороні клієнта та сканувати ланцюги gadget→sink**, генеруючи PoC на льоту.
4. **Знаходити вектори DOM clobbering** (наприклад, колізії `id` / `name`, які перезаписують глобальні змінні).
5. **Тонко налаштовувати поведінку** через багатий інтерфейс налаштувань (кастомний canary, автоматичне впровадження, блокування перенаправлень, списки джерел/приймачів тощо).
### Enable It
---
У вбудованому браузері Burp перейдіть до **Burp extension** та увімкніть його:
### 1. Увімкніть його
<figure><img src="../../images/image (1129).png" alt=""><figcaption></figcaption></figure>
Тепер оновіть сторінку, і у **Dev Tools** ви знайдете **вкладку DOM Invader:**
1. Відкрийте **Proxy ➜ Intercept ➜ Open Browser** (вбудований браузер Burp).
2. Натисніть на логотип **Burp Suite** (угорі праворуч). Якщо він прихований, спочатку натисніть на деталь.
3. У вкладці **DOM Invader** увімкніть **Enable DOM Invader** та натисніть **Reload**.
4. Відкрийте DevTools ( `F12` / Клацніть правою кнопкою ➜ Перевірити ) і закріпіть його. З'являється нова панель **DOM Invader**.
<figure><img src="../../images/image (695).png" alt=""><figcaption></figcaption></figure>
> Burp запам'ятовує стан для кожного профілю. Вимкніть його в *Settings ➜ Tools ➜ Burps browser ➜ Store settings...*, якщо потрібно.
### Inject a Canary
### 2. Впровадьте Canary
На попередньому зображенні ви можете побачити **випадкову групу символів, це Канар**. Тепер ви повинні почати **впроваджувати** його в різні частини вебу (параметри, форми, url...) і кожного разу натискати пошук. DOM Invader перевірить, чи **канар закінчився в будь-якому цікавому стоку**, який може бути використаний.
**Canary** - це випадковий маркерний рядок (наприклад, `xh9XKYlV`), який відстежує DOM Invader. Ви можете:
Більше того, опції **Inject URL params** та Inject forms автоматично відкриють **нову вкладку**, **впроваджуючи** **канар** в кожен **URL** параметр та **форму**, яку вони знайдуть.
* **Скопіювати** його та вручну впровадити в параметри, форми, Web-Socket фрейми, веб-повідомлення тощо.
* Використовувати кнопки **Inject URL params / Inject forms**, щоб відкрити нову вкладку, де canary автоматично додається до кожного ключа/значення запиту або поля форми.
* Шукати **порожній canary**, щоб виявити всі приймачі незалежно від можливості експлуатації (чудово для розвідки).
### Inject an empty Canary
#### Кастомний canary (2025+)
Якщо ви просто хочете знайти потенційні стоки, які може мати сторінка, навіть якщо вони не підлягають експлуатації, ви можете **шукати порожній канар**.
Burp 2024.12 представив **Canary settings** (логотип Burp ➜ DOM Invader ➜ Canary). Ви можете:
### Post Messages
* **Випадковувати** або встановити **кастомний рядок** (корисно для тестування з кількома вкладками або коли значення за замовчуванням з'являється природно на сторінці).
* **Скопіювати** значення в буфер обміну.
* Зміни вимагають **Reload**.
DOM Invader дозволяє тестувати DOM XSS за допомогою веб-повідомлень з такими функціями, як:
---
1. **Логування веб-повідомлень**, надісланих через `postMessage()`, подібно до логування історії запитів/відповідей HTTP Burp Proxy.
2. **Модифікація** та **повторна відправка** веб-повідомлень для ручного тестування DOM XSS, подібно до функції Burp Repeater.
3. **Автоматичне зміна** та відправка веб-повідомлень для перевірки DOM XSS.
### 3. Веб-повідомлення (`postMessage`)
#### Message details
Підвкладка **Messages** записує кожен виклик `window.postMessage()`, показуючи використання `origin`, `source` та `data`.
Детальну інформацію про кожне повідомлення можна переглянути, натиснувши на нього, що включає, чи доступ JavaScript на стороні клієнта до властивостей `origin`, `data` або `source` повідомлення.
**Змінити та повторно надіслати**: двічі клацніть на повідомлення, відредагуйте `data` і натисніть **Send** (схоже на Burp Repeater).
- **`origin`** : Якщо **інформація про походження повідомлення не перевіряється**, ви можете надіслати крос-доменні повідомлення до обробника подій **з довільного зовнішнього домену**. Але якщо це перевіряється, це все ще може бути небезпечно.
- **`data`**: Тут надсилається корисне навантаження. Якщо ці дані не використовуються, стік марний.
- **`source`**: Оцінює, чи перевіряється властивість source, зазвичай посилаючись на iframe, замість походження. Навіть якщо це перевіряється, це не гарантує, що перевірка не може бути обійдена.
**Авто-фуззинг**: увімкніть **Postmessage interception ➜ Auto-mutate** в налаштуваннях, щоб дозволити DOM Invader генерувати навантаження на основі canary та повторно надсилати їх обробнику.
#### Reply a message
Підсумок значення полів:
1. У перегляді **Messages** натисніть на будь-яке повідомлення, щоб відкрити діалогове вікно деталей повідомлення.
2. Відредагуйте поле **Data** за потреби.
3. Натисніть **Send**.
* **origin** чи перевіряє обробник `event.origin`.
* **data** місце розташування навантаження. Якщо не використовується, приймач не має значення.
* **source** перевірка посилання на iframe / вікно; часто слабша, ніж перевірка строгого походження.
### Prototype Pollution
---
DOM Invader також може шукати **вразливості забруднення прототипу**. Спочатку вам потрібно увімкнути це:
### 4. Забруднення прототипу
<figure><img src="../../images/image (1026).png" alt=""><figcaption></figcaption></figure>
Увімкніть у **Settings ➜ Attack types ➜ Prototype pollution**.
Потім він **шукатиме джерела**, які дозволяють вам додавати довільні властивості до **`Object.prototype`**.
Робочий процес:
1. **Перегляд** DOM Invader позначає джерела забруднення (`__proto__`, `constructor`, `prototype`), знайдені в URL/запиті/хеші або JSON веб-повідомленнях.
2. **Тест** натискає *Test*, щоб відкрити вкладку PoC, де має існувати `Object.prototype.testproperty`:
Якщо щось буде знайдено, з'явиться кнопка **Test**, щоб **перевірити знайдене джерело**. Натисніть на неї, з'явиться нова вкладка, створіть об'єкт у консолі та перевірте, чи існує `testproperty`:
```javascript
let b = {}
b.testproperty
let obj = {};
console.log(obj.testproperty); // ➜ 'DOM_INVADER_PP_POC'
```
Якщо ви знайшли джерело, ви можете **сканувати на наявність гаджетів**:
3. **Сканувати на наявність гаджетів** DOM Invader брутфорсить імена властивостей і відстежує, чи потрапляють вони в небезпечні приймачі (наприклад, `innerHTML`).
4. **Експлуатувати** коли знайдено ланцюг gadget-sink, з'являється кнопка *Exploit*, яка з'єднує джерело + гаджет + приймач для виклику сповіщення.
1. Нову вкладку відкриває DOM Invader, коли натискається кнопка **Scan for gadgets**, яка знаходиться поруч з будь-яким виявленим джерелом забруднення прототипу у вигляді **DOM**. Потім починається сканування на наявність підходящих гаджетів.
2. Тим часом у тій же вкладці повинна бути відкрита вкладка **DOM Invader** в панелі DevTools. Після завершення сканування будь-які sink, доступні через виявлені гаджети, відображаються у вигляді **DOM**. Наприклад, властивість гаджета з назвою `html`, що передається в sink `innerHTML`, показана в наведеному нижче прикладі.
Розширені налаштування (іконка шестерні):
## DOM забруднення
* **Видалити CSP / X-Frame-Options**, щоб зберегти працездатність iframe під час сканування гаджетів.
* **Сканувати техніки в окремих фреймах**, щоб уникнути перешкод `__proto__` та `constructor`.
* **Вимкнути техніки** окремо для крихких додатків.
На попередньому зображенні видно, що сканування на наявність DOM забруднення можна увімкнути. Після цього **DOM Invader почне шукати вразливості DOM забруднення**.
---
## Посилання
### 5. DOM Clobbering
Увімкніть **Attack types ➜ DOM clobbering**. DOM Invader моніторить динамічно створені елементи, атрибути `id`/`name` яких колізують з глобальними змінними або об'єктами форм (`<input name="location">` → перезаписує `window.location`). Запис створюється щоразу, коли контрольований користувачем розмітка призводить до заміни змінної.
---
## 6. Огляд налаштувань (2025)
DOM Invader тепер розділений на категорії **Main / Attack Types / Misc / Canary**.
1. **Main**
* **Enable DOM Invader** глобальний перемикач.
* **Postmessage interception** увімкнути/вимкнути логування повідомлень; підперемикачі для автоматичної мутації.
* **Custom Sources/Sinks** *іконка шестерні* ➜ увімкнути/вимкнути конкретні приймачі (наприклад, `eval`, `setAttribute`), які можуть зламати додаток.
2. **Attack Types**
* **Prototype pollution** (з налаштуваннями для кожної техніки).
* **DOM clobbering**.
3. **Misc**
* **Redirect prevention** блокувати перенаправлення на стороні клієнта, щоб список приймачів не загубився.
* **Breakpoint before redirect** призупинити JS безпосередньо перед перенаправленням для перевірки стеку викликів.
* **Inject canary into all sources** автоматично впроваджувати canary скрізь; налаштовуваний список дозволених джерел/параметрів.
4. **Canary**
* Перегляд / випадковість / встановлення кастомного canary; копіювати в буфер обміну. Зміни вимагають перезавантаження браузера.
---
### 7. Поради та хороші практики
* **Використовуйте відмінний canary** уникайте загальних рядків, таких як `test`, інакше виникають хибнопозитивні результати.
* **Тимчасово вимкніть важкі приймачі** (`eval`, `innerHTML`), якщо вони порушують функціональність сторінки під час навігації.
* **Поєднуйте з Burp Repeater & Proxy** відтворюйте запит/відповідь браузера, які призвели до вразливого стану, і створюйте фінальні URL-адреси експлуатації.
* **Пам'ятайте про область фрейму** джерела/приймачі відображаються в кожному контексті перегляду; вразливості всередині iframe можуть вимагати ручної уваги.
* **Експортуйте докази** клацніть правою кнопкою на панелі DOM Invader ➜ *Зберегти скріншот* для включення в звіти.
---
## References
- [https://portswigger.net/burp/documentation/desktop/tools/dom-invader](https://portswigger.net/burp/documentation/desktop/tools/dom-invader)
- [https://portswigger.net/burp/documentation/desktop/tools/dom-invader/enabling](https://portswigger.net/burp/documentation/desktop/tools/dom-invader/enabling)
@ -85,5 +132,7 @@ b.testproperty
- [https://portswigger.net/burp/documentation/desktop/tools/dom-invader/web-messages](https://portswigger.net/burp/documentation/desktop/tools/dom-invader/web-messages)
- [https://portswigger.net/burp/documentation/desktop/tools/dom-invader/prototype-pollution](https://portswigger.net/burp/documentation/desktop/tools/dom-invader/prototype-pollution)
- [https://portswigger.net/burp/documentation/desktop/tools/dom-invader/dom-clobbering](https://portswigger.net/burp/documentation/desktop/tools/dom-invader/dom-clobbering)
- [https://portswigger.net/burp/documentation/desktop/tools/dom-invader/settings/canary](https://portswigger.net/burp/documentation/desktop/tools/dom-invader/settings/canary)
- [https://portswigger.net/burp/documentation/desktop/tools/dom-invader/settings/misc](https://portswigger.net/burp/documentation/desktop/tools/dom-invader/settings/misc)
{{#include ../../banners/hacktricks-training.md}}