クイズ:XSSとCSRFはどこにありますか?

先の日記(XSSはブラウザ上でスクリプトが動き、CSRFはサーバー上でスクリプトが動く - ockeghem(徳丸浩)の日記)は、仕込んだネタがあたって多くの方に読んでいただいた。細かい内容については、頂戴した批判や反省もあるが、このテーマに対して多くの関心を集めることができたのは良かったと思う。今回も、手を変え品を変えて、XSSCSRFの違いを説明しよう。ということで、今回はクイズ仕立てにしてみた。
といっても、非常に簡単なクイズだ。
認証を必要とする会員制サイトmaitter.comで、個人情報を入力する画面がある。典型的な、入力(A)-確認(B)-登録(C)という画面遷移(下図)を想定した場合、


  1. XSSが発生しやすい画面を一つあげよ
  2. CSRFが発生しやすい画面を一つあげよ

というものだ(入力画面は初期入力のみ想定)。エラー時の挙動などは指定されていないので想定しないものとする。
解答が見えるといけないので、以下、空行をいくつかいれておく。


















それでは解答編。

XSS

XSSが発生しやすい画面は(B)の確認画面だ。XSSは先の日記で書いたように、表示部分にスクリプトを埋め込むというものなので、表示内容を外部からコントロールできる部分に発生し得る。問題の想定で、表示内容がコントロールできるのは、(B)のみであるので、このページが該当することになる。
確認画面(B)にXSS脆弱性があった場合の攻撃例を下図に示す。

図のように、表示画面上でJavaScriptを表示するように、外部から「攻撃用JavaScript」を含むパラメータを送り込んでやる。確認画面がGETメソッドを許容している場合は、単にURL上にJavaScriptを挿入してやればよいが、POSTのみ許容する場合は、図のようにワナのページを用意してそこかJavaScriptでPOSTしてやる必要がある。といっても、この部分は見えないIFRAMEにすることなどで、閲覧者に気づかれないように仕組むことは容易だ。典型的なケースでは、「攻撃用JavaScript」はmaitter.comドメインcookie値を読み出し、ワナのサイトに送出してやる。
cookieを受け取った攻撃者は、これを悪用して、被害者になりすますことが可能となる。


CSRF

次に、CSRFが発生しやすい画面は(C)の登録画面だ。CSRFはサーバー上で副作用を起こさせるワザなので、副作用(DBの更新、パスワードの変更)のある画面(C)が対象となる。
この場合の攻撃例を下図に示そう。

このパターンでは、登録画面の機能を悪用して、パスワードを「dan」に書きかえる。画面(C)は認証の必要なページではあるが、このページ自体がmaitter.com上にあるので、認証用のcookieは画面(C)に送出される(元々認証済みだった場合)。かくして攻撃者は、被害者のパスワードもcookieも分からない状態で、パスワードを「dan」に書き換えるという結果をえる。 
攻撃者は、パスワードが書き換えられたタイミングを見計らって、新しいパスワード「dan」を使って被害者のIDにログインする。


まとめ

XSSCSRFの典型的な発生箇所および攻撃例をクイズ形式で説明した。このように並べてみると、やはりXSSCSRFは、似ている部分がかなりある。異なるのは前回説明したように、(1)XSSは(外部から送り込んだ)攻撃用スクリプトがブラウザ上で動く、(2)CSRFはサーバー(に元々ある)スクリプトを悪用する、という点だ。
本稿は、XSSCSRFのイメージをつかんでいただくためのものであるので、技術的に正確な説明や対策方法については、安全なWebサイトの作り方などのドキュメントを参照いただきたい。