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

This commit is contained in:
Translator 2025-08-05 00:33:57 +00:00
parent 21b570eab5
commit 9af0c123bd

View File

@ -4,80 +4,127 @@
## DOM Invader
DOM Invader는 Burp의 내장 브라우저에 설치된 브라우저 도구입니다. 이 도구는 웹 메시지 및 프로토타입 오염을 포함한 다양한 소스와 싱크를 사용하여 **DOM XSS 취약점 탐지**를 지원합니다. 이 도구는 확장 프로그램으로 사전 설치되어 있습니다.
DOM Invader는 **Burp Suite의 내장 Chromium 브라우저**에 설치된 브라우저 도구입니다. 이 도구는 **DOM XSS 및 기타 클라이언트 측 취약점**(프로토타입 오염, DOM 클로버링 등)을 자동으로 **JavaScript 소스 및 싱크를 계측**하여 감지하는 데 도움을 줍니다. 이 확장은 Burp와 함께 제공되며 활성화만 하면 됩니다.
DOM Invader는 브라우저의 DevTools 패널 내에 탭을 통합하여 다음을 가능하게 합니다:
DOM Invader는 브라우저의 DevTools 패널에 탭을 추가하여 다음을 수행할 수 있습니다:
1. **DOM XSS 테스트를 위한 웹페이지의 제어 가능한 싱크 식별**, 컨텍스트 및 정화 세부정보 제공.
2. **`postMessage()` 메서드를 통해 전송된 웹 메시지의 로깅, 편집 및 재전송**. DOM Invader는 특별히 제작된 웹 메시지를 사용하여 취약점을 자동으로 탐지할 수도 있습니다.
3. **클라이언트 측 프로토타입 오염** 소스 탐지 및 위험한 싱크로 전송된 제어 가능한 가젯 스캔.
4. **DOM 클로버링 취약점 식별**.
1. **실시간으로 제어 가능한 싱크**를 식별하고, 컨텍스트(속성, HTML, URL, JS) 및 적용된 정화 정보를 포함합니다.
2. **`postMessage()` 웹 메시지**를 기록, 편집 및 재전송하거나 확장이 자동으로 변형하도록 할 수 있습니다.
3. **클라이언트 측 프로토타입 오염 소스를 감지하고 가젯→싱크 체인을 스캔**하여 즉석에서 PoC를 생성합니다.
4. **DOM 클로버링 벡터**를 찾습니다(예: 전역 변수를 덮어쓰는 `id` / `name` 충돌).
5. **풍부한 설정 UI**를 통해 동작을 미세 조정합니다(사용자 정의 카나리, 자동 주입, 리디렉션 차단, 소스/싱크 목록 등).
### 활성화하기
---
Burp의 내장 브라우저에서 **Burp 확장**으로 이동하여 활성화합니다:
### 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...*에서 비활성화할 수 있습니다.
### 카나리 주입하기
### 2. 카나리 주입하기
이전 이미지에서 **무작위 문자 그룹, 즉 카나리**를 볼 수 있습니다. 이제 웹의 다양한 부분(매개변수, 양식, URL 등)에 **주입**하기 시작하고 매번 검색을 클릭합니다. DOM Invader는 **카나리가 어떤 흥미로운 싱크에 도달했는지** 확인합니다.
**카나리**는 DOM Invader가 추적하는 임의의 마커 문자열(예: `xh9XKYlV`)입니다. 다음을 수행할 수 있습니다:
또한, **Inject URL params** 및 Inject forms 옵션은 **새 탭**을 자동으로 열어 **카나리**를 찾은 모든 **URL** 매개변수 및 **양식**에 **주입**합니다.
* **복사**하여 매개변수, 양식, 웹 소켓 프레임, 웹 메시지 등에 수동으로 주입합니다.
* **Inject URL params / Inject forms** 버튼을 사용하여 카나리가 모든 쿼리 키/값 또는 양식 필드에 자동으로 추가되는 새 탭을 엽니다.
* **빈 카나리**를 검색하여 모든 싱크를 노출시킵니다(정찰에 유용).
### 빈 카나리 주입하기
#### 사용자 정의 카나리 (2025+)
페이지에 잠재적인 싱크가 있을 수 있는지 찾고 싶지만, 그것들이 악용 가능하지 않더라도, **빈 카나리**를 **검색**할 수 있습니다.
Burp 2024.12는 **카나리 설정**을 도입했습니다(Burp 로고 ➜ DOM Invader ➜ 카나리). 다음을 수행할 수 있습니다:
### 메시지 전송
* **무작위화**하거나 **사용자 정의 문자열**을 설정합니다(다중 탭 테스트에 유용하거나 기본값이 페이지에 자연스럽게 나타날 때).
* 값을 클립보드에 **복사**합니다.
* 변경 사항은 **Reload**가 필요합니다.
DOM Invader는 웹 메시지를 사용하여 DOM XSS를 테스트할 수 있도록 하며, 다음과 같은 기능을 제공합니다:
---
1. **`postMessage()`를 통해 전송된 웹 메시지 로깅**, Burp Proxy의 HTTP 요청/응답 기록 로깅과 유사합니다.
2. **웹 메시지의 수정** 및 **재발행**을 통해 DOM XSS를 수동으로 테스트할 수 있으며, Burp Repeater의 기능과 유사합니다.
3. **웹 메시지의 자동 변경** 및 전송을 통해 DOM XSS를 탐색합니다.
### 3. 웹 메시지 (`postMessage`)
#### 메시지 세부정보
**Messages** 하위 탭은 모든 `window.postMessage()` 호출을 기록하며 `origin`, `source`, `data` 사용을 보여줍니다.
각 메시지에 대해 클릭하여 자세한 정보를 볼 수 있으며, 여기에는 클라이언트 측 JavaScript가 메시지의 `origin`, `data` 또는 `source` 속성에 접근하는지 여부가 포함됩니다.
**수정 및 재전송**: 메시지를 더블 클릭하고 `data`를 편집한 후 **Send**를 누릅니다(Burp Repeater와 유사).
- **`origin`** : 메시지의 **origin 정보가 확인되지 않으면**, 임의의 외부 도메인에서 이벤트 핸들러로 교차 출처 메시지를 보낼 수 있습니다. 그러나 확인되면 여전히 안전하지 않을 수 있습니다.
- **`data`**: 페이로드가 전송되는 곳입니다. 이 데이터가 사용되지 않으면, 싱크는 무용지물입니다.
- **`source`**: 일반적으로 iframe을 참조하는 source 속성이 origin 대신 검증되는지 평가합니다. 이것이 확인되더라도 검증이 우회될 수 없다는 보장은 없습니다.
**자동 퍼징**: 설정에서 **Postmessage interception ➜ Auto-mutate**를 활성화하여 DOM Invader가 카나리 기반 페이로드를 생성하고 핸들러에 재생하도록 합니다.
#### 메시지 회신하기
필드 의미 요약:
1. **Messages** 보기에서 메시지를 클릭하여 메시지 세부정보 대화 상자를 엽니다.
2. 필요한 대로 **Data** 필드를 편집합니다.
3. **Send**를 클릭합니다.
* **origin** 핸들러가 `event.origin`을 검증하는지 여부.
* **data** 페이로드 위치. 사용되지 않으면 싱크는 무관합니다.
* **source** iframe / window 참조 검증; 종종 엄격한 출처 확인보다 약합니다.
### 프로토타입 오염
---
DOM Invader는 **프로토타입 오염 취약점**을 검색할 수도 있습니다. 먼저, 이를 활성화해야 합니다:
### 4. 프로토타입 오염
<figure><img src="../../images/image (1026).png" alt=""><figcaption></figcaption></figure>
**Settings ➜ Attack types ➜ Prototype pollution**에서 활성화합니다.
그런 다음, **`Object.prototype`**에 임의의 속성을 추가할 수 있는 **소스**를 **검색**합니다.
작업 흐름:
1. **탐색** DOM Invader는 URL/쿼리/해시 또는 JSON 웹 메시지에서 발견된 오염 **소스**(`__proto__`, `constructor`, `prototype`)를 플래그합니다.
2. **테스트** *Test*를 클릭하여 `Object.prototype.testproperty`가 존재해야 하는 PoC 탭을 엽니다:
무언가가 발견되면 **Test** 버튼이 나타나 **발견된 소스**를 **테스트**할 수 있습니다. 클릭하면 새 탭이 열리고 콘솔에서 객체를 생성하여 `testproperty`가 존재하는지 확인합니다:
```javascript
let b = {}
b.testproperty
let obj = {};
console.log(obj.testproperty); // ➜ 'DOM_INVADER_PP_POC'
```
소스를 찾으면 **가젯 스캔**을 할 수 있습니다:
3. **가젯 스캔** DOM Invader는 속성 이름을 무작위로 시도하고 어떤 것이 위험한 싱크에 도달하는지 추적합니다(예: `innerHTML`).
4. **익스플로잇** 가젯-싱크 체인이 발견되면 *Exploit* 버튼이 나타나 소스 + 가젯 + 싱크를 연결하여 경고를 트리거합니다.
1. **DOM** 뷰에서 식별된 프로토타입 오염 소스 옆에 있는 **가젯 스캔** 버튼을 클릭하면 DOM Invader가 새 탭을 엽니다. 적합한 가젯에 대한 스캔이 시작됩니다.
2. 한편, 같은 탭에서 DevTools 패널에 **DOM Invader** 탭이 열려 있어야 합니다. 스캔이 완료되면 식별된 가젯을 통해 접근 가능한 모든 싱크가 **DOM** 뷰에 표시됩니다. 예를 들어, `innerHTML` 싱크에 전달되는 `html`이라는 가젯 속성이 아래 예제에 표시됩니다.
고급 설정(톱니바퀴 아이콘):
## DOM 클로버링
* **CSP / X-Frame-Options 제거**하여 가젯 스캔 중 iframe이 작동 가능하도록 유지합니다.
* **별도의 프레임에서 스캔 기술**을 사용하여 `__proto__``constructor` 간섭을 피합니다.
* **기술을 개별적으로 비활성화**하여 취약한 앱에 맞춥니다.
이전 이미지에서 DOM 클로버링 스캔을 켤 수 있는 것을 볼 수 있습니다. 완료되면 **DOM Invader가 DOM 클로버링 취약점을 검색하기 시작합니다**.
---
## 참조
### 5. DOM 클로버링
**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** 클라이언트 측 리디렉션을 차단하여 싱크 목록이 손실되지 않도록 합니다.
* **Redirect 전에 중단점** 리디렉션 직전에 JS를 일시 중지하여 호출 스택을 검사합니다.
* **모든 소스에 카나리 주입** 카나리를 모든 곳에 자동 주입합니다; 구성 가능한 소스/매개변수 허용 목록.
4. **Canary**
* 카나리 보기 / 무작위화 / 사용자 정의 카나리 설정; 클립보드에 복사합니다. 변경 사항은 브라우저 새로 고침이 필요합니다.
---
### 7. 팁 및 모범 사례
* **구별되는 카나리 사용** `test`와 같은 일반 문자열을 피하십시오. 그렇지 않으면 잘못된 긍정이 발생합니다.
* **무거운 싱크**(`eval`, `innerHTML`)는 탐색 중 페이지 기능이 중단되면 일시적으로 비활성화합니다.
* **Burp Repeater 및 Proxy와 결합** 취약한 상태를 생성한 브라우저 요청/응답을 복제하고 최종 익스플로잇 URL을 작성합니다.
* **프레임 범위 기억** 소스/싱크는 브라우징 컨텍스트별로 표시됩니다; iframe 내부의 취약점은 수동으로 집중해야 할 수 있습니다.
* **증거 내보내기** DOM Invader 패널에서 오른쪽 클릭 ➜ *Save screenshot*을 클릭하여 보고서에 포함합니다.
---
## 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}}