前回は、DOM Based XSSの脆弱性の概要や対策が必要なアプリについて解説した。今回は、脆弱なコード例を交えて対策方法を解説する。

DOM Based XSSの脆弱性が作り込まれてしまったコード例

 DOM Based XSSの脆弱性は、「アプリの開発者が用意した正規のJavaScriptに問題があるため作り込まれたXSS」である。今回は、Webサイトのアクセス解析用CGIの設置コードを用いて、DOM Based XSSの脆弱性の原因と対策について解説していく。

アクセス解析用CGIの設置コード
<script>
document.write('<img src="http://example.jp/accesslog.cgi?ref='
+ document.referrer
+ '" width="1" height="1">');
</script>

 上記設置コードは、アクセス解析用のCGI開発者が用意した正規のJavaScriptで記述されている。このJavaScriptは、アクセス解析したいWebページに設置するためのものである。Webページを閲覧した利用者がどこのWebページからアクセスしてきたのかを集計するために、参照元のWebページのURLである「document.referrer」の情報をaccesslog.cgiに渡しているが、この処理に問題があるため、DOM Based XSSの脆弱性が作り込まれてしまっている1)。なぜこのコードが問題なのかを、DOM Based XSSの流れを見ながら攻撃を解説することで示そう。

1)ブラウザーによってdocument.referrerの情報の扱いが異なるため、例示している脆弱なコードを狙った攻撃が成立するかどうはブラウザーに依存する。IPAでは、Internet Explorer 8および9で再現することを確認した。

 DOM Based XSSの脆弱性を悪用した攻撃は下記の通りである(図1)。

[画像のクリックで拡大表示]
攻撃の流れ
  • (1)利用者が悪意ある者が設置した「罠ページ」(下記URL)にアクセスする
    URL:http://evil.example.com/?"><script>不正なJavaScriptの基データ</script>

  • (2)罠ページは自動的に、アクセス解析用CGIの設置コードを含むページ(下記URL)にリダイレクトするように細工されている(URL:http://victim.example.jp/)。
  • (3)アクセス解析用CGIの設置コードは、(1)でアクセスしたURL情報(=http://evil.example.com/?"><script>不正なJavaScriptの基データ</script>)をdocument.referrerで取得し、それを現在閲覧しているページにdocument.writeで埋め込むため、(1)に含まれる攻撃者が用意したJavaScriptが利用者のブラウザー上で実行される。

 利用者は罠サイトを訪れただけであるが、最終的に、利用者のブラウザー上で攻撃者が用意した不正なJavaScriptが実行されてしまう。不正なJavaScriptは、http://victim.example.jp/と利用者のブラウザーの間でやりとりしているCookie情報や、ブラウザーに表示しているページの内容を操作することができるため、Cookieにログイン状態を管理するセッションIDが含まれていれば、攻撃者はセッションIDを盗み、罠にひっかかった利用者になりすますことが可能である。