# XS-Search/XS-Leaks
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)を使用して、世界で最も高度なコミュニティツールによって駆動される**ワークフローを簡単に構築し、自動化**します。\ 今すぐアクセスを取得: {% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %} {% hint style="success" %} AWSハッキングを学び、実践する:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ GCPハッキングを学び、実践する:[**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
HackTricksをサポートする * [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)を確認してください! * **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**Telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**をフォローしてください。** * **ハッキングトリックを共有するには、[**HackTricks**](https://github.com/carlospolop/hacktricks)および[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを送信してください。**
{% endhint %} ## 基本情報 XS-Searchは、**サイドチャネル脆弱性**を利用して**クロスオリジン情報を抽出する**ための手法です。 この攻撃に関与する主要なコンポーネントは以下の通りです: * **脆弱なWeb**:情報を抽出することを目的としたターゲットウェブサイト。 * **攻撃者のWeb**:攻撃者が作成した悪意のあるウェブサイトで、被害者が訪れ、エクスプロイトをホストしています。 * **インクルージョンメソッド**:脆弱なWebを攻撃者のWebに組み込むために使用される技術(例:window.open、iframe、fetch、hrefを持つHTMLタグなど)。 * **リーク技術**:インクルージョンメソッドを通じて収集された情報に基づいて、脆弱なWebの状態の違いを識別するために使用される技術。 * **状態**:攻撃者が区別しようとする脆弱なWebの2つの潜在的な条件。 * **検出可能な違い**:攻撃者が脆弱なWebの状態を推測するために依存する観察可能な変化。 ### 検出可能な違い 脆弱なWebの状態を区別するために分析できるいくつかの側面: * **ステータスコード**:サーバーエラー、クライアントエラー、または認証エラーなど、クロスオリジンの**さまざまなHTTPレスポンスステータスコード**を区別します。 * **API使用**:特定のJavaScript Web APIを使用しているかどうかを明らかにするために、ページ間の**Web APIの使用**を特定します。 * **リダイレクト**:HTTPリダイレクトだけでなく、JavaScriptやHTMLによってトリガーされる異なるページへのナビゲーションを検出します。 * **ページコンテンツ**:HTTPレスポンスボディやページのサブリソースにおける**変化を観察**します。例えば、**埋め込まれたフレームの数**や画像のサイズの違いなど。 * **HTTPヘッダー**:特定のHTTPレスポンスヘッダーの存在やその値を記録します。X-Frame-Options、Content-Disposition、Cross-Origin-Resource-Policyなどのヘッダーが含まれます。 * **タイミング**:2つの状態間の一貫した時間の違いに気づきます。 ### インクルージョンメソッド * **HTML要素**:HTMLは、スタイルシート、画像、スクリプトなど、**クロスオリジンリソースのインクルージョン**のためのさまざまな要素を提供し、ブラウザに非HTMLリソースを要求させます。この目的のための潜在的なHTML要素の一覧は[https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks)で見つけることができます。 * **フレーム**:**iframe**、**object**、および**embed**などの要素は、攻撃者のページにHTMLリソースを直接埋め込むことができます。ページが**フレーミング保護を欠いている**場合、JavaScriptはcontentWindowプロパティを介してフレーム化されたリソースのウィンドウオブジェクトにアクセスできます。 * **ポップアップ**:**`window.open`**メソッドは、新しいタブまたはウィンドウでリソースを開き、JavaScriptがSOPに従ってメソッドやプロパティと対話するための**ウィンドウハンドル**を提供します。ポップアップは、シングルサインオンでよく使用され、ターゲットリソースのフレーミングおよびクッキー制限を回避します。ただし、最新のブラウザはポップアップの作成を特定のユーザーアクションに制限しています。 * **JavaScriptリクエスト**:JavaScriptは、**XMLHttpRequests**や**Fetch API**を使用してターゲットリソースへの直接リクエストを許可します。これらのメソッドは、HTTPリダイレクトに従うかどうかを選択するなど、リクエストに対する正確な制御を提供します。 ### リーク技術 * **イベントハンドラー**:XS-Leaksにおける古典的なリーク技術で、**onload**や**onerror**のようなイベントハンドラーがリソースの読み込みの成功または失敗に関する洞察を提供します。 * **エラーメッセージ**:JavaScriptの例外や特別なエラーページは、エラーメッセージから直接またはその存在と不在を区別することによってリーク情報を提供できます。 * **グローバル制限**:ブラウザの物理的制限(メモリ容量や他の強制されたブラウザ制限など)は、しきい値に達したときに信号を送ることができ、リーク技術として機能します。 * **グローバル状態**:ブラウザの**グローバル状態**(例:履歴インターフェース)との検出可能な相互作用を悪用できます。例えば、ブラウザの履歴の**エントリ数**は、クロスオリジンページに関する手がかりを提供できます。 * **パフォーマンスAPI**:このAPIは、**現在のページのパフォーマンス詳細**を提供し、ドキュメントや読み込まれたリソースのネットワークタイミングを含み、要求されたリソースに関する推測を可能にします。 * **読み取り可能な属性**:いくつかのHTML属性は**クロスオリジンで読み取り可能**であり、リーク技術として使用できます。例えば、`window.frame.length`プロパティは、JavaScriptがクロスオリジンのウェブページに含まれるフレームの数をカウントすることを可能にします。 ## XSinatorツールと論文 XSinatorは、**いくつかの既知のXS-Leaksに対してブラウザをチェックする**自動ツールです。詳細はその論文で説明されています:[**https://xsinator.com/paper.pdf**](https://xsinator.com/paper.pdf) ツールには[**https://xsinator.com/**](https://xsinator.com/)でアクセスできます。 {% hint style="warning" %} **除外されたXS-Leaks**:他のリークに干渉するため、**サービスワーカー**に依存するXS-Leaksを除外する必要がありました。さらに、特定のWebアプリケーションの誤設定やバグに依存するXS-Leaksも**除外することにしました**。例えば、CrossOrigin Resource Sharing (CORS)の誤設定、postMessageのリーク、またはCross-Site Scripting。加えて、時間ベースのXS-Leaksも除外しました。なぜなら、これらはしばしば遅く、ノイズが多く、不正確であるからです。 {% endhint %}
\ [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)を使用して、世界で最も高度なコミュニティツールによって駆動される**ワークフローを簡単に構築し、自動化**します。\ 今すぐアクセスを取得: {% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %} ## **タイミングベースの技術** 以下の技術のいくつかは、ウェブページの可能な状態の違いを検出するプロセスの一部としてタイミングを使用します。ウェブブラウザで時間を測定する方法はいくつかあります。 **時計**: [performance.now()](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now) APIは、開発者が高解像度のタイミング測定を取得することを可能にします。\ 攻撃者が暗黙の時計を作成するために悪用できるAPIは多数あります:[Broadcast Channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast\_Channel\_API)、[Message Channel API](https://developer.mozilla.org/en-US/docs/Web/API/MessageChannel)、[requestAnimationFrame](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame)、[setTimeout](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout)、CSSアニメーションなど。\ 詳細については:[https://xsleaks.dev/docs/attacks/timing-attacks/clocks](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/)を参照してください。 ## イベントハンドラ技術 ### Onload/Onerror * **インクルージョンメソッド**:フレーム、HTML要素 * **検出可能な違い**:ステータスコード * **詳細情報**:[https://www.usenix.org/conference/usenixsecurity19/presentation/staicu](https://www.usenix.org/conference/usenixsecurity19/presentation/staicu)、[https://xsleaks.dev/docs/attacks/error-events/](https://xsleaks.dev/docs/attacks/error-events/) * **概要**:リソースを読み込もうとすると、onerror/onloadイベントがトリガーされ、リソースが成功裏に/失敗して読み込まれたかどうかを判断することができます。 * **コード例**:[https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)](https://xsinator.com/testing.html#Event%20Handler%20Leak%20\(Script\)) {% content-ref url="xs-search/cookie-bomb-+-onerror-xs-leak.md" %} [cookie-bomb-+-onerror-xs-leak.md](xs-search/cookie-bomb-+-onerror-xs-leak.md) {% endcontent-ref %} コード例は、**JSからスクリプトオブジェクトを読み込もうとしますが、**オブジェクト、スタイルシート、画像、音声などの**他のタグ**も使用できます。さらに、**タグを直接挿入**し、その中に`onload`および`onerror`イベントを宣言することも可能です(JSから挿入するのではなく)。 この攻撃にはスクリプトなしのバージョンもあります: ```html ``` In this case if `example.com/404` is not found `attacker.com/?error` will be loaded. ### Onload Timing * **Inclusion Methods**: HTML要素 * **Detectable Difference**: タイミング(一般的にページコンテンツ、ステータスコードによる) * **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events) * **Summary:** [**performance.now()**](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) **API**は、リクエストを実行するのにかかる時間を測定するために使用できます。ただし、他の時計も使用でき、例えば[**PerformanceLongTaskTiming API**](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongTaskTiming)は、50ms以上実行されているタスクを特定できます。 * **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events) 別の例は: {% content-ref url="xs-search/performance.now-example.md" %} [performance.now-example.md](xs-search/performance.now-example.md) {% endcontent-ref %} #### Onload Timing + Forced Heavy Task この技術は前のものと似ていますが、**攻撃者**は**関連する時間**をかける**アクションを強制**し、**応答が肯定的または否定的**なときにその時間を測定します。 {% content-ref url="xs-search/performance.now-+-force-heavy-task.md" %} [performance.now-+-force-heavy-task.md](xs-search/performance.now-+-force-heavy-task.md) {% endcontent-ref %} ### unload/beforeunload Timing * **Inclusion Methods**: フレーム * **Detectable Difference**: タイミング(一般的にページコンテンツ、ステータスコードによる) * **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events) * **Summary:** [SharedArrayBuffer clock](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#sharedarraybuffer-and-web-workers)は、リクエストを実行するのにかかる時間を測定するために使用できます。他の時計も使用できます。 * **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events) リソースを取得するのにかかる時間は、[`unload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/unload\_event)および[`beforeunload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload\_event)イベントを利用して測定できます。**`beforeunload`**イベントは、ブラウザが新しいページに移動しようとしているときに発生し、**`unload`**イベントは、実際にナビゲーションが行われているときに発生します。これら2つのイベント間の時間差を計算することで、**ブラウザがリソースを取得するのにかかった時間**を特定できます。 ### Sandboxed Frame Timing + onload * **Inclusion Methods**: フレーム * **Detectable Difference**: タイミング(一般的にページコンテンツ、ステータスコードによる) * **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks) * **Summary:** [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) APIは、リクエストを実行するのにかかる時間を測定するために使用できます。他の時計も使用できます。 * **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks) [Framing Protections](https://xsleaks.dev/docs/defenses/opt-in/xfo/)がない場合、ページとそのサブリソースがネットワーク上で読み込まれるのにかかる時間を攻撃者が測定できることが観察されています。この測定は通常可能で、iframeの`onload`ハンドラーはリソースの読み込みとJavaScriptの実行が完了した後にのみトリガーされるためです。スクリプト実行によって導入される変動を回避するために、攻撃者は` ``` ### #ID + error + onload * **Inclusion Methods**: フレーム * **Detectable Difference**: ページコンテンツ * **More info**: * **Summary**: 正しいコンテンツにアクセスしたときにページがエラーを出し、任意のコンテンツにアクセスしたときに正しく読み込まれるようにできる場合、時間を測ることなくすべての情報を抽出するためのループを作成できます。 * **Code Example**: あなたが**秘密の**コンテンツを**Iframeの中に**持つ**ページ**を**挿入**できると仮定します。 あなたは**被害者に**"_**flag**_"を含むファイルを**Iframe**を使って検索させることができます(例えばCSRFを悪用する)。Iframeの中では、_**onloadイベント**_が**常に少なくとも一度は実行される**ことがわかっています。次に、**URL**の**iframe**を変更できますが、URLの**ハッシュ**の**コンテンツ**だけを変更します。 例えば: 1. **URL1**: www.attacker.com/xssearch#try1 2. **URL2**: www.attacker.com/xssearch#try2 最初のURLが**正常に読み込まれた**場合、**URLのハッシュ**部分を**変更**すると、**onload**イベントは**再度トリガーされません**。しかし、ページが**読み込み時に何らかのエラー**を持っていた場合、**onload**イベントは**再度トリガーされます**。 そのため、**正しく**読み込まれたページと、アクセス時に**エラー**が発生したページを**区別**できます。 ### Javascript Execution * **Inclusion Methods**: フレーム * **Detectable Difference**: ページコンテンツ * **More info**: * **Summary:** **ページ**が**機密**コンテンツを**返す**、**または**ユーザーによって**制御**可能な**コンテンツ**を返す場合。ユーザーは**負のケース**で**有効なJSコードを設定**し、各試行を**`