web-dev-qa-db-ja.com

エレメントのonerrorおよび他のon <event>属性が実行されている間、innerHTMLを介して挿入されたスクリプトが実行されないのはなぜですか? -Google XSSチャレンジ2

SPOILER ALERT:甘やかされたくない場合は続行しないでください

現在 Google XSSチャレンジレベル2 を行っています。

_element.innerHTML_を使用してドキュメントに挿入されるXSSコードを挿入しています。 <script>alert("Foobar")</script>が機能しない理由はわかりませんが、<img src="/" onerror = "alert(1);"は機能します。

私はソースコードを見てみましたが、それでも理由がわかりません。私はXSSを初めて使用するので、回答を作成するときにソースコードを参照していただければ幸いです。

7
Computernerd

その答えは、ブラウザがページ内のさまざまな場所にあるスクリプトを実行する方法によって異なります。例えば:

  • インラインスクリプトタグ内のJavaScriptは、Webページ内の他のマークアップと同期して処理されます。これらのスクリプトタグは、Webページの処理を遅くする可能性があります。
  • DOMのロード後に要素に割り当てられたスクリプトタグ(チャレンジ2の場合など)は、ほとんどの場合実際には実行されません(回答の最後の例外を参照)!
  • 属性としてのイベントハンドラー内のJavaScriptは、特定のイベントが発生するとすぐに実行されます(この場合、<img src="/" onerror = "alert(1);"<body onload="alert(2)"></body>などの入力が機能する理由)。

例外:

defer属性を持つスクリプトタグは、DOMが完全にレンダリングされるまで(ブラウザによっては)実行されません。たとえば、私はIEで同じチャレンジを試みましたが、次のユーザー入力を使用してポップアップに警告することができました:

<script defer>alert(2)</script>
4
Rahil Arora

InnerHTMLのスクリプトタグを介してDOMに挿入されたスクリプトは、挿入時に実行されません(インラインスクリプトは、元のページが解析されるときに実行されます)。一方、DOMに挿入された画像はそのときに読み込まれ、読み込みが失敗すると、onerrorイベントハンドラーが呼び出されます。

3
David