# 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" %}
htARTE(HackTricks AWS Red Team Expert)で**ゼロからヒーローまでのAWSハッキング**を学びましょう! HackTricksをサポートする他の方法: * **HackTricksで企業を宣伝**したい場合や**HackTricksをPDFでダウンロード**したい場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください! * [**公式PEASS&HackTricksグッズ**](https://peass.creator-spring.com)を入手してください * [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションをご覧ください * **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**に参加するか、[telegramグループ](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**をフォロー**してください。 * **ハッキングトリックを共有するために、PRを** [**HackTricks**](https://github.com/carlospolop/hacktricks) **および** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **githubリポジトリに提出**してください。
## 基本情報 XS-Searchは、**サイドチャネルの脆弱性**を利用して**クロスオリジン情報を抽出**するための手法です。 この攻撃に関与する主要なコンポーネントは次のとおりです: * **脆弱なWeb**: 情報を抽出する対象のウェブサイト。 * **攻撃者のWeb**: 攻撃者が作成した悪意のあるウェブサイトで、被害者が訪れ、攻撃をホストする。 * **インクルージョンメソッド**: 脆弱なWebを攻撃者のWebに組み込むために使用される技術(例:window.open、iframe、fetch、hrefを持つHTMLタグなど)。 * **リーク技術**: インクルージョンメソッドを通じて収集された情報に基づいて脆弱なWebの状態の違いを識別するために使用される技術。 * **状態**: 攻撃者が区別しようとする脆弱なWebの2つの潜在的な状態。 * **検出可能な違い**: 攻撃者が脆弱なWebの状態を推測するために依存する観察可能な変化。 ### 検出可能な違い 脆弱なWebの状態を区別するためにいくつかの側面が分析される可能性があります: * **ステータスコード**: クロスオリジンで**さまざまなHTTP応答ステータスコード**を区別することができます。サーバーエラー、クライアントエラー、認証エラーなど。 * **APIの使用**: ページ間で**Web APIの使用**を特定し、クロスオリジンページが特定のJavaScript Web APIを使用しているかどうかを明らかにします。 * **リダイレクト**: HTTPリダイレクトだけでなく、JavaScriptやHTMLによってトリガーされる異なるページへのナビゲーションを検出します。 * **ページコンテンツ**: HTTP応答本体やページのサブリソース(埋め込まれたフレームの数や画像のサイズの違いなど)の変化を観察します。 * **HTTPヘッダー**: 特定のHTTP応答ヘッダー(X-Frame-Options、Content-Disposition、Cross-Origin-Resource-Policyなど)の存在または値を認識します。 * **タイミング**: 2つの状態間で一貫した時間の違いに気付きます。 ### インクルージョンメソッド * **HTML要素**: HTMLは、スタイルシート、画像、スクリプトなど、クロスオリジンリソースのインクルージョンに使用できるさまざまな要素を提供します。この目的のために潜在的なHTML要素のコンパイルは[https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks)で見つけることができます。 * **フレーム**: **iframe**、**object**、**embed**などの要素は、HTMLリソースを攻撃者のページに直接埋め込むことができます。ページに**フレーミング保護がない**場合、JavaScriptはcontentWindowプロパティを介してフレーム化されたリソースのwindowオブジェクトにアクセスできます。 * **ポップアップ**: **`window.open`**メソッドは、新しいタブやウィンドウでリソースを開き、JavaScriptがSOPに従ってメソッドやプロパティとやり取りできるウィンドウハンドルを提供します。シングルサインオンでよく使用されるポップアップは、対象リソースのフレーミングやクッキー制限を回避します。ただし、現代のブラウザはポップアップの作成を特定のユーザーアクションに制限しています。 * **JavaScriptリクエスト**: JavaScriptは、**XMLHttpRequest**や**Fetch API**を使用して対象リソースに直接リクエストを行うことができます。これらのメソッドは、HTTPリダイレクトのフォローアップなど、リクエストに対する正確な制御を提供します。 ### リーク技術 * **イベントハンドラ**: XS-Leaksの古典的なリーク技術で、**onload**や**onerror**などのイベントハンドラが、リソースの読み込みの成功または失敗に関する洞察を提供します。 * **エラーメッセージ**: JavaScriptの例外や特別なエラーページは、エラーメッセージ自体から直接リーク情報を提供するか、その存在と不在の違いを区別することによってリーク情報を提供することができます。 * **グローバル制限**: ブラウザの物理的制限(メモリ容量など)や他の強制されたブラウザの制限は、しきい値に達したときに信号を送ることができ、リーク技術として機能します。 * **グローバルステート**: ブラウザの**グローバルステート**(履歴インターフェースなど)との検出可能な相互作用を悪用することができます。たとえば、ブラウザの履歴に含まれる**エントリの数**は、クロスオリジンページについての手がかりを提供する可能性があります。 * **Performance 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**: 他のXSinatorのリークと干渉する可能性があるため、**サービスワーカーに依存するXS-Leaks**を除外する必要がありました。さらに、特定のWebアプリケーションのミス構成やバグに依存する**XS-Leaksを除外**することにしました。たとえば、Cross-Origin 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 ``` ### Onload Timing * **Inclusion Methods**: HTML Elements * **Detectable Difference**: Timing (generally due to Page Content, Status Code) * **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 このテクニックは前のものと同様ですが、**attacker**は**positiveまたはnegativeの回答**時に**関連する時間**を**強制的に**かかるようにし、その時間を測定します。 {% 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**: Frames * **Detectable Difference**: Timing (generally due to Page Content, Status Code) * **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**: Frames * **Detectable Difference**: Timing (generally due to Page Content, Status Code) * **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 + エラー + onload * **Inclusion Methods**: フレーム * **Detectable Difference**: ページコンテンツ * **More info**: * **Summary**: 正しいコンテンツにアクセスしたときにページにエラーを発生させ、任意のコンテンツにアクセスしたときに正しく読み込まれるようにすると、時間を計測せずにすべての情報を抽出するループを作成できます。 * **Code Example**: ページに秘密のコンテンツを挿入できると仮定します。 被害者に、CSRFを悪用してIframe内の「_flag_」を含むファイルを検索させることができます。Iframe内では、_onload イベント_ が常に少なくとも1回実行されることがわかります。その後、URLのハッシュ内のコンテンツだけを変更して、IframeのURLを変更できます。 例: 1. **URL1**: www.attacker.com/xssearch#try1 2. **URL2**: www.attacker.com/xssearch#try2 最初のURLが**正常に読み込まれた**場合、URLの**ハッシュ**部分を変更しても**onload** イベントは**再度トリガーされません**。しかし、ページが読み込まれる際に何らかの**エラー**がある場合、**onload** イベントは**再度トリガー**されます。 そのため、**正しく**読み込まれたページとアクセス時に**エラー**があるページを区別できます。 ### Javascriptの実行 * **Inclusion Methods**: フレーム * **Detectable Difference**: ページコンテンツ * **More info**: * **Summary:** もし**ページ**が**機密情報**を**返す**か、ユーザーによって**制御可能なコンテンツ**を返す場合、ユーザーは**負の場合に有効なJSコードを設定**し、各試行を**`