Part4では,ユーザーのWebブラウザにスクリプトを送り込み,それを実行させるクロスサイト・スクリプティングの手口と対策,および強制ブラウジングの手口と対策を詳しく見ていこう。
クロスサイト・スクリプティングは,ユーザーのWebブラウザにスクリプトを送り込み,それを実行させる攻撃手法である(図1)。セッションIDを盗むのに使われることが多い。セッションIDを盗むほかの手口はWebサイトとブラウザの間の通信をSSLで暗号化していれば防げるが,クロスサイト・スクリプティングはSSLを使っていても防げない。
ほとんどのWebアプリはCookie(クッキー)というテキスト形式のデータでセッションIDを管理している。クロスサイト・スクリプティングが標的にするのはこのCookieだ。盗んだCookieをクラッカが使えば,どのパソコンからでも正規ユーザーになりすまして狙ったWebサイトに不正アクセスできてしまう。手口を細かく見ていこう。
スクリプトでCookieを抜き取る
クロスサイト・スクリプティングでは,クラッカは直接スクリプトを送り込まずに,わざわざ攻撃目標のWebサイトを経由させてスクリプトを送り込む。このようにややこしい手口を使うのには理由がある。クラッカの意図が,自分が狙ったWebサイトがエンドユーザーに送り出す情報を盗んだり,Webページを書き換えることにあるからだ。そこでクラッカは,狙いをつけたWebサイトをいったん経由させる形でスクリプトを送り込むのだ。こうすれば,スクリプトはそのWebサイトのCookieにアクセスできる。
クラッカはまず,クラッカのWebサイトからリンクにスクリプトを紛れ込ませたWebページをダウンロードさせる(図1の1)。リンクには標的のサイトの書き込み用Webページを指定して,URLに続く書き込み用の値としてスクリプト・コードを潜ませる。
だまされたエンドユーザーがこのリンクをクリックすると,クラッカが狙ったWebサイトへの書き込みとしてスクリプトが送り込まれる(同2)。Webサイトが受け取ったパラメータをそのまま書き込みとして受け付けると,ユーザーにスクリプト付きのWebページが返ってくる(同3)。このスクリプトが起動して悪さをするわけだ。
このようにしてクラッカが実行させたスクリプトは,経由したWebサイトに関するセッションIDを含むCookieに自由にアクセスできる。そこで,アクセスしたCookieをクラッカの用意したWebサイトに書き込ませるなどの方法で盗み出す(同4)。
サイト側の文字列チェックで防ぐ
クロスサイト・スクリプティングは,クロスサイト・リクエスト・フォージェリと同じで,クラッカが用意したWebページを正規ユーザーに表示させることから始まる。一見Webブラウザ側に問題があるように見えるが,本当の問題は狙われたWebサイト側にある。Webサイト側でクロスサイト・スクリプティング対策をしていれば,セッション情報が盗まれることはない。
対策は,Webアプリがスクリプトとなる文字列を検出すること。SQLインジェクションと同様に,入力文字列をチェックし,問題となる文字をサニタイジングする。不要な文字ならブロックし,表示に必要なら表示用の別の文字列に変換するわけだ。 クロスサイト・スクリプティングによる攻撃は,最近では目立たない。しかし今でも,対策に不備があるWebサイトは少なくない。