mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/xss-cross-site-scripting/dom-invader.md'
This commit is contained in:
parent
be6410a10f
commit
cd3ae71a7c
@ -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 ➜ Burp’s 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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user