web-dev-qa-db-ja.com

img srcおよびbackground-image urlのXSSベクトル

Img.srcとバックグラウンドURLを提供する際のXSSの脆弱性について少し混乱しています。私が理解していることから、この場合にJavaScriptを実行する唯一の方法は、JavaScriptプロトコルを使用することです。この例を考えてみましょう:

if (location.hash.indexOf('javascript:') !== 0) {
    img.style.backgroundImage='url("'+location.hash+'")';
 }
 img.src='some/local/path/'+location.hash;

このコードにXSSの脆弱性はありますか?

3
Maciej Krawczyk

いいえ、最新のブラウザでは、XSは_<img>_のstyleまたはsrc属性を介して可能ではありません鬼ごっこ。

したがって、どちらも最新のブラウザでJSコードを実行しません。

_<img src="javascript:alert(1)">
<img src="x.jpg" style=background-image:url('javascript:alert(2)')">
_

CSS属性でのJavascriptのサポートには 長い間見捨てられていました があります。あなたはそれに関するいくつかの古い参照を見つけることができます ここ

サンプルコードの分析

_location.hash_は常に_#_記号で始まります。この文字はJSでは違法であり、新しいURLの有効な始まりではないため、そもそもXSSは不可能です。 (たとえば、eval(location.hash)は常に構文エラーを生成します。)

_#_を無視し、_location.hash_に必要な文字列を実際に含めることができると仮定します。

次に、このセキュリティチェックに欠陥があります。

_(location.hash.indexOf('javascript:') !== 0)
_

攻撃者は、_JaVaScRiPt:_で始まるURLを構築する可能性があります。また、実装では先行スペースや制御文字を許可しないと想定することは危険です(例:_\t\x00javascript:_)。また、URLエンコードについてはどうですか? _javascript%3a_で始まるペイロードはフィルターを通過します。また、_data:_プロトコルを許可しますか? URLを絶対的な場所に制限したい場合は、_http://_をブラックリストに登録する代わりに、_https://_と_javascript:_の先頭をホワイトリストに登録できます。

これは問題ありません:

_img.src='some/local/path/'+location.hash;
_

src属性がスクリプトコードの影響を受けやすい場合でも、プレフィックス_some/local/path/_を使用すると、それをJS URLに変換できなくなります。ただし、攻撃者は同じサーバー上の画像ファイルへの相対パスを指定する可能性があり、望ましくない場合があります。

NB:これは悪意のある_javascript:_ URLの構築に関するものです。 HTML出力または別のコンテキストに_location.hash_などのユーザー制御値を使用する場合は、文字列を適切にサニタイズする必要があります。

6
Arminius

はい、それはis問題であり、おそらく大きな問題ですが、「XSS」はおそらく正しい用語ではありません。

何がうまくいかないのでしょうか?

  1. svgを使用したリモートコード実行、特に古いブラウザ
  2. オフサイトの画像がユーザーのIPアドレス(別名lat/lon)、userAgent、およびネットパフォーマンスをリークする
  3. 悪意のある画像自体がベクターであり、過去0日間が多数
  4. 特別なGIFや、大げさなGIFでも、ページ/ CPUをGrindに送ることができます
  5. 大きな画像を使用して既知のデータを大量に注入し、暗号化を解除することができます
  6. あなたのサイトはあなたが関連付けられたくないものを「宣伝」するかもしれません
  7. オフサイトの画像は、特定のユーザーが特定のリンクを取得してアクセスしたことを確認できます

これらのどれも従来のXSSではありませんが、残念です。

カスタマイズ機能が必要な場合は、オンサイトイメージのホワイトリストから選択することをお勧めします。

1
dandavis