クロスサイトスクリプティング

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動先: 案内検索

テンプレート:出典の明記 クロスサイトスクリプティングテンプレート:Lang-en-short)とは、ウェブページの部分をユーザからの入力を動的にエコーバックすることによって生成するアプリケーションのセキュリティ上の不備を意図的に利用して、サイト間を横断して悪意のあるスクリプトを注入させること。また経緯上、それを許してしまう脆弱性についても、このように呼ばれている。

略記として、CSSおよびXSSがある。CSSは同分野でよく使用されるCascading Style Sheetsの略語と同じになってしまうため、混乱を避けるためにXSSと表記されることが多くなった。

概要

攻撃者が対象となるサイトとは異なるサイトからスクリプトを送り込み、訪問者に実行せしめることから、クロスサイト(サイトを横断した)スクリプティング(スクリプト処理)と呼ばれる。

ウェブアプリケーションが入力したデータ(フォーム入力など)を適切にエスケープしないままHTML中に出力することにより、入力中に存在するタグ等文字がそのままHTMLとして解釈される。ここでスクリプトを起動させることにより、以下に挙げるような攻撃が成立する。

  • クッキーの値を取得あるいは設定することにより、セッションハイジャックする。
  • 強制的なページ遷移を起こさせ、クロスサイトリクエストフォージェリ対策を回避する。取得したクッキーを攻撃者側でそのまま利用できない場合に用いられる手法。
  • CSSのインポート機能を利用して不正なファイルをロードさせる。
  • ページ全体を置き換えることにより、偽のページを作り出す。典型的にはフィッシングに用いられる。
  • フォームの送信先を置換することにより、入力を第三者サイトに送信するよう仕向ける。

これらの攻撃が成立することにより、秘密情報の窃取や、回復不可能な権利侵害につながるおそれがある。

原理

フォームから入力された情報を表示するサイトがあり、このサイトでは以下のようなウェブページを動的に生成していると仮定する。

 <p>Hello, (フォームで入力した値)</p>

このサイトで、フォームに JavaScript のコード、例えば、<script>alert("警告")</script>等を入力したとする。このサイトが、入力を適切にエスケープしていない場合、上記のページは以下のように生成される。

 <p>Hello, <script>alert("警告")</script></p>

このページを受信したウェブブラウザは、このスクリプトを実行し、画面上に「警告」と表示されたメッセージボックスを出力する。

対策

クロスサイトスクリプティングの対策は、いくつかの例外を除き、出力値のエスケープを適切に施すことである。

  1. HTMLの実体参照を用い、&&amp; に、<&lt; に、>&gt; に、"&quot; に、それぞれ置換する。
  2. タグの属性値は必ず "~"ダブルクオート)で括る。また属性値中のエスケープを忘れない。例:<input type="hidden" name="foo" value="&lt;script&gt;">

例外は以下のような場合である。

入力値をURIとして用いる場合(リダイレクタなど)
許可するスキームを定め、それ以外のスキームを持つURIは拒否する。
入力値をスタイルシートとして使用する場合
許可する構文を定め、それ以外の使用は拒否する。スタイルシート中のスクリプト起動方法は多様であり、ブラックリスト方式で完全に抑制することは難しい。
入力中の一定のタグをHTMLとして反映したい場合(例: ウィキ
ホワイトリスト(許可リスト)を使用した出力タグ、あるいは属性の制限を行う。制限には上述のURI中のスキーマ制限や、スタイルシートへの制限を含む。

周辺

基本的にはウェブサイト側の脆弱性を突いて、ウェブサイトにアクセスした利用者に任意のスクリプトを実行させる状況であるため、ウェブサイト管理者側が脆弱性対策を行わずに放置したような場合、サイト利用者側が取れる根本的な対策はほとんどない。

利用者側のポリシーとして「怪しいサイトには行かない」では不十分であり、「脆弱性の対策をしていないサイトは利用しない」という、一般人は有効に適用できそうもないポリシーを取るしかない。

その唯一の例外としては、JavaScriptActiveXなどを含むブラウザーのスクリプトを無効にすること、スクリプトや動的生成ページを使用しない静的ページのみにアクセスを限定する、という程度である。 ただ、wiki、ブログ、SNSなど、近年のウェブサイトはそのほとんどがスクリプトを用いて動的に生成されているため、インターネット利用者が上記の対策を行った上でウェブサイトを利用することは不可能に近い。

脚注

テンプレート:Reflist

外部リンク

テンプレート:エクスプロイト