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の脆弱性はありますか?
いいえ、最新のブラウザでは、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
_などのユーザー制御値を使用する場合は、文字列を適切にサニタイズする必要があります。
はい、それはis問題であり、おそらく大きな問題ですが、「XSS」はおそらく正しい用語ではありません。
何がうまくいかないのでしょうか?
これらのどれも従来のXSSではありませんが、残念です。
カスタマイズ機能が必要な場合は、オンサイトイメージのホワイトリストから選択することをお勧めします。