ユーニックス総合研究所

  • home
  • archives
  • web-xss

クロスサイトスクリプティング(XSS)とは: 悪意のあるスクリプトを実行させる

  • 作成日: 2020-09-18
  • 更新日: 2023-12-24
  • カテゴリ: Web

クロスサイトスクリプティング(XSS)とは?

クロスサイトスクリプティング(XSS)とは、動的Webサイトの脆弱性を利用し、サイト閲覧ユーザーに任意のスクリプトを実行させ、個人情報などを奪い取る攻撃手法です。

動的Webサイトとは?

動的Webサイトとは、TwitterやFacebook, 掲示板のようにユーザーの入力をコンテンツとして表示するサイトのことです。
たとえば掲示板の場合は、ユーザーの投稿が掲示板上に表示されます。

簡単なXSSのストーリー

簡単なXSSのストーリーを紹介します。

  1. A君が掲示板に訪問した
  2. 自動で別の懸賞サイトのページが開き、個人情報の入力を促された
  3. A君は個人情報を入力して送信した

↑のストーリーではXSSによってA君の個人情報がアタッカーに盗まれています。
どのような攻撃をされてしまったのでしょうか?

XSSの仕組み

XSSの仕組みは以下のようなものです。

猟場選び

まずXSSを実行するアタッカーは、脆弱性のある動的サイトを探します。
ここで言う脆弱性とは、サイトがユーザーの入力を検証していないということです。
たとえば掲示板であれば、投稿内容にJavaScriptのコードを含ませることができるところを探します。

悪意のあるスクリプトの投稿

アタッカーは掲示板などの投稿内容にスクリプトを含ませて、掲示板に投稿します。
するとその掲示板はスクリプト付きの投稿内容をサイト上に表示してしまいます。
ユーザーがその掲示板を開くと、アタッカーが投稿したスクリプトが実行されます。

悪意のあるスクリプトによるユーザーの誘導

悪意のあるスクリプトは、その掲示板とは別のサイトにユーザーを誘導します(クロスサイト)。
たとえばスクリプトで強制的に現在のURLを書き換えて、トラップサイトを表示します。

トラップサイト上で個人情報を奪取

表示されたトラップサイト上には個人情報を入力するフォームなどが表示されます。
ユーザーがそのフォームに個人情報を入力し、送信してしまうと、トラップサイトはユーザーの入力内容やCookieの内容などをアタッカーに送信します。
こうしてアタッカーはユーザーの個人情報を入手します。

ここで紹介した例はXSSの一例です。

XSSが実行されてしまう原因

なぜこのような攻撃が可能になってしまうのでしょうか?
すべての原因は、動的サイトの脆弱性にあります。

入力内容の未検証

動的サイトがユーザーの入力内容を検証していないため、悪意のあるスクリプトも投稿できてしまうわけです。
動的サイトにはユーザーの入力内容を検証し、不正な入力を無力化する必要性があります。
今回の例で言えば、サイト側がアタッカーが掲示板に投稿したJavaScriptのコードを検証・無効化するか、そもそも投稿内容にJavaScriptを書けないようにする必要がありました。

この入力値の検証はバリデーションと呼ばれます。
そして入力の一部を無力化するのはサニタイジングと呼ばれます(定義には議論があるそうです)。

XSSへの対応

XSSの原因は動的Webサイトが入力を検証していないことが原因でした。
では掲示板などの動的Webサイトはどのようにしてユーザーの入力値を検証し、XSSを防ぐのでしょうか。

入力値のバリデーションを行う

バリデーション(検証)とは、ユーザーの入力内容を検証し、データの内容が定義した内容から外れていれば不正なデータとして見なす行為です。

たとえば100文字しか入力できない名前欄があるとします。
しかし悪意のあるユーザーが200文字入力しました。
サイトはこの入力値をバリデート(検証)し、名前の長さが100文字より上だったら不正な入力とみなし、名前を投稿できないようにします。
これがバリデーションです。

ユーザーの入力を一切信用せず、サイト側で定義したデータのフォーマットに従っていないデータはすべて不正な入力とみなし、意図的に入力処理を失敗させるわけです。
こうすることで不正な入力をはじき、XSSを防ぎます。

入力値をサニタイズする

サニタイジングとはユーザーの入力の一部を指定のフォーマットに置き換える処理のことです。
このサニタイジングの定義についてはネットでは議論があるようです(2020年現在)。

たとえばJavaScriptのコードを実行するHTMLの<script>タグがあります。
このタグが画面に出力されてしまうとタグ内のスクリプトが実行されてしまいます。
そうならないように、<script>タグを&lt;script&gt;などに置き換えて出力します。
こうすることでタグを無効化し、タグ内のスクリプトが実行されないようにします。

タグやスクリプトで入力を制限する

フォームなどの入力に対しHTMLのタグの属性やJavaScriptを動作させ、不正な入力を監視し、そもそもそういった入力をできないようにするのも1つの方法です。
たとえばHTMLの<input>タグにはmaxlength属性があり、この属性に入力の最大長を指定するとユーザーはそれ以上の長さの入力ができなくなります。

組み合わせる

バリデーションとサニタイジング、入力の制限を組み合わせることでXSSに対して2重3重の対策ができることになるので、一般的なWebアプリではこれらを組み合わせて対策されます。
重要なのはバリデーションの定義です。
たとえば「HTMLタグの入力を一切受け付けない」というバリデーションの定義があれば、そのバリデーションが実行される掲示板では悪意のあるHTMLタグを投稿できなくなります。

さらに自作ライブラリなどを使わずに定評のあるバリデーターツールを使うとより強固なプログラムになります。
最近のWebフレームワークにはこういったバリデーターが内包されていることが多いです。

大手サイトも狙われる

アタッカーはXSSを起点にして様々な攻撃をユーザーに仕掛けます。
開発者はそうならないようにWebアプリを設計する必要があります。

しかし実際は大手サイトもXSSによって損害を得ています。
たとえばTwitterやYoutubeなどです。

やはりプログラムが人の手で書かれる以上、そういった「漏れ」は存在するものです。
アタッカーはその「漏れ」を探しています。

🦝 < 人が作るとやっぱミスとかあるからね

余談: ホワイトハッカー/ブラックハッカー

こういった脆弱性の報告をするハッカーは「ホワイトハッカー」などとも呼ばれ、企業によってはその活動に報酬を出すところもあります。
一方、攻撃を仕掛けるハッカー(クラッカー)は「ブラックハッカー」と呼ばれます。