クロスサイトスクリプティング
出典: フリー百科事典『ウィキペディア(Wikipedia)』
クロスサイトスクリプティング (Cross Site Scripting) とは、動的にWebページを生成するアプリケーションのセキュリティ上の不備を意図的に利用し、狭義にはサイト間を横断して悪意のあるスクリプトを混入させること。また、それを許す脆弱性のこと。広義にはスクリプトを混入させずとも、任意の要素を混入させられうる脆弱性を含む。略記としてCSS、XSSがある。CSSは同分野でよく使用されるCascading Style Sheetsの略でもあるので、混乱を避けるためにXSSと表記されることが多い。
攻撃者が対象となるサイトとは異なるサイトからスクリプトを送り込み、訪問者に実行せしめることから、クロスサイト(サイトを横断した)スクリプティング(スクリプト処理)と呼ばれる。
ウェブアプリケーションが入力したデータ(フォーム入力など)を適切にエスケープしないままHTML中に出力することにより、入力中に存在するタグ等文字がそのままHTMLとして解釈される。ここでスクリプトを起動させることにより、以下に挙げるような攻撃が成立する。
- クッキーの値を取得あるいは設定することにより、セッションハイジャックする
- 強制的なページ遷移を起こさせ、クロスサイトリクエストフォージェリの踏み台とする
- ページ全体を置き換えることにより、偽のページを作り出す(典型的にはフィッシングに用いられる)
- フォームの送信先を置換することにより、入力を第三者サイトに送信するよう仕向ける
これらの攻撃が成立することにより、秘密情報の窃取や、回復不可能な権利侵害につながるおそれがある。
[編集] 原理
フォームから入力された情報を表示するサイトがあり、このサイトでは以下のようなWebページを動的に生成していると仮定する。
<p>Hello, (フォームで入力した値)</p>
このサイトにおいて、フォームにJavaScriptのコード(例えば、<script>alert("警告")</script>
)を入力したとする。このサイトが、入力を適切にエスケープしていない場合、上記のページは以下のように生成される。
<p>Hello, <script>alert("警告")</script></p>
このページを受信したWebブラウザは、このスクリプトを実行し、画面上に「警告」と表示されたメッセージボックスを出力する。
[編集] 対策
クロスサイトスクリプティングの対策は、いくつかの例外を除き、出力値のエスケープを適切に施すことである。
- HTMLの実体参照を用い、
&
を&
に、<
を<
に、>
を>
に、"
を"
に、それぞれ置換する。 - タグの属性値は必ず
"~"
で括る。また属性値中のエスケープを忘れない。例:<input type="hidden" name="foo" value="<script>">
例外は以下のような場合である。
- 入力値をURIとして用いる場合(リダイレクタなど)
- 許可するスキームを定め、それ以外のスキームを持つURIは拒否する。
- 入力値をスタイルシートとして使用する場合
- 許可する構文を定め、それ以外の使用は拒否する。スタイルシート中のスクリプト起動方法は多様であり、ブラックリスト方式で完全に抑制することは難しい。
- 入力中の一定のタグをHTMLとして反映したい場合(例: ウィキ)
- ホワイトリスト(許可リスト)を使用した出力タグ、あるいは属性の制限を行う。制限には上述のURI中のスキーマ制限や、スタイルシートへの制限を当然に含む。