LINEスタンプ制作代行サービス・LINEスタンプの作り方!

お電話でのお問い合わせ:03-6869-8600

stampfactory大百科事典

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

クロスサイトスクリプティング()とは、Webアプリケーションの脆弱性もしくはそれを利用した攻撃。脆弱性をツリー型に分類するCWEではXSSを不適切な入力確認(CWE-20)によるインジェクション(CWE-74)のひとつとして分類している(CWE-79)。略称はXSS。かつてはCSSという略称も使われていたが、Cascading Style Sheetsと紛らわしいのでこの略称はあまり使われなくなった。「クロスサイト(サイト横断)」という名称は歴史的なもので、初期に発見されたXSSでは脆弱性のあるサイトと攻撃者のサイトを「サイト横断的」に利用して攻撃を実行する事から名づけられたものだが、XSSの定義は新しいタイプの攻撃が見つかるたびに拡張され、サイト横断的なものでなくともXSSと呼ぶようになった。この拡張された定義においてXSS攻撃とは、攻撃者の作成したスクリプトを"脆弱性のある標的サイトのドメインの権限で"閲覧者のブラウザで実行させる攻撃一般を指す。斜体で書いた部分がXSS攻撃の重要な特徴であり、この特徴により標的サイトの権限がないと実行できないようブラウザが制限している(同一生成元ポリシー)はずの行動を、攻撃者に実行可能にしてしまう。XSSについて述べる前に、ウェブサイトの仕組みについて簡単に復習する。JavaScriptのようなクライアントサイドのスクリプトは、ウェブサイトが閲覧者が取った行動(例えばフォーム に何を記載したか)を変数の形で取得し、動的にウェブページの内容を変えたり新しいページとそのURLを生成したりする。セキュリティの観点から見た場合スクリプトは非常に強力で、ブラウザに保管されているcookieの内容を読み書きしたり、ユーザがウェブサイトにログインしている場合にはサイトが置かれているサーバからユーザ固有の情報を取得する事も可能であり、さらにはそうした情報を別のサイトに転送したりする事も可能である。したがってこうしたスクリプトの仕組みを悪用された場合には大きな危険を伴う事になる。こうした事情によりウェブブラウザには同一生成元ポリシーという、スクリプトの悪用を制限するためのポリシーが実装されている。このポリシーは、「ウェブページ1に記載されたスクリプトがそれとば別のウェブページ2に関するデータにアクセスできるのは、ページ1と2が同一の「オリジン」にある場合のみである」とするものである。ここでページ1と2のオリジンが同一であるとは、1と2のプロトコル、ホスト名、ポート番号が一致する事を指す。具体的にはページ1のURLがhttp://example.com/page1.htmlであった場合、ページ2のURLもhttp://example.com/ではじまっていてさらにポート番号も同一の場合のみページ1から2のデータにアクセスできる。多くのケースにおいて同一のウェブサイト上にあるページは同一のホスト上において同一のプロトコル(http)と同一ポート番号(80番)で動作するものなので、ウェブサイトを構築する上で同一生成元ポリシーはあまり邪魔にならない。しかし攻撃者が全く別のサイトからスクリプトによりhttp://example.com/のデータを不正に読み取ろうとしたとしても同一生成元ポリシーがこれを妨げるので、このポリシーによりセキュリティは担保される。XSS攻撃は、ウェブサイトの脆弱性(XSS脆弱性)を利用して同一生成元ポリシーを迂回し、脆弱性のあるウェブサイト(標的サイト)の権限で悪意のあるスクリプトを実行する事を目的として行われる。悪意のあるスクリプトは標的サイトの権限で実行されるので、攻撃者がスクリプトを適切に記述することにより、標的サイトで利用可能なデータを自由に閲覧したり書き換えたりする事ができる。これを利用して標的サイトを閲覧したユーザ(=被害者)のcookieやウェブサイトに保管されている個人情報を盗むなど、様々な攻撃が可能になる。より正確に言うと、XSS脆弱性は、以下の様な攻撃(XSS攻撃)を可能にする脆弱性として定義される(CWE-79)。攻撃者は標的サイトのWebアプリケーションに不正なデータDを注入(インジェクション)し、その結果WebアプリケーションがDを含むWebページPを動的に生成させる。被害者がブラウザなどでPを開くと不正なデータDが原因で悪意のあるスクリプトが実行され、被害者は何らかの被害を受ける。すでに述べたように、ウェブサイトではユーザがフォームなどで入力した値を変数として持つ。変数にセットされた値はその後のウェブサイト閲覧で使用され、変数の値やそこから計算された値がウェブページに表示されることもある。XSS脆弱性の簡単な例としてはユーザが値を決定できる変数値を加工せずそのままウェブページに表示してしまうというものがある。例えばウェブページにユーザの性別を選択させるフォームがあり、そのページではユーザが選択した値("man"もしくは"woman")を変数genderにそのまま保管し、genderの内容を(これまでと同一もしくは別の)ページ上にそのまま表示する事でフォームに入力した内容をユーザに再確認させるとする。このようなページhttp://example.com/において、攻撃者が何らかの方法でgenderの値をにセット(悪意のあるスクリプトの注入)し、この状態で被害者となるユーザがこのページにアクセスしてしまうとXSS攻撃は成功となる。実際、http://example.com/のウェブページには、変数genderの値をそのまま表示してしまうという脆弱性があるので、攻撃者が前述のようにgenderをセットした状態でユーザがこのページを閲覧してしまうと、ユーザのブラウザにはgenderの値であるが表示されてしまう為、悪意のあるスクリプトがユーザのブラウザ上で実行されてしまう。なお攻撃者が悪意のあるスクリプトの注入する方法はウェブページにどのようなXSS脆弱性が存在するのかに依存する。フォームの入力値の2通りの送信方法(GETメソッド、POSTメソッド)に応じてXSS攻撃の例を「#具体例」の節で2通り述べる。またウェブサイトの作者がgenderの値としてフォームに準備した値が「man」と「woman」の2つだけだったとしても、ウェブサイト側でgenderにセットされた値が「man」か「woman」のいずれかであるとウェブサイトをおいているサーバ側でチェックしない限り、攻撃者はそれ以外の値(=悪意のあるスクリプト)にgenderをセット可能である。HTML内には攻撃者が悪意のあるスクリプトの注入し得る箇所として以下のものがある:前述したフォームの出力の脆弱性は1のケースに相当し、「genderの値をそのまま出力せよ」という趣旨のスクリプト文に悪意のあるスクリプトを注入している。2.の場合、URLとして「javascript:(Javascript文)」の形式(javascryptスキーム)を利用してjavascryptを注入することができる。上述したXSS攻撃の場合、ユーザにフォームで入力させた値をそのままURLに表示したことが原因である。上述のXSSへの対策としてはユーザからフォームの値を取得した際、htmlで特別な意味を持つ記号を以下のように別の記号に置き換える(エスケープ処理をする)という方法がある:このようにすると攻撃者が攻撃用スクリプトを埋め込むのに利用したhtmlのタグ「