クロスサイトスクリプティング(XSS)とは?種類と攻撃例

「ホームページにセキュリティ対策を施したい」とあなたが思ったとき、もちろんその方法について調べると思います。

その際、おそらく度々目にするのが、「クロスサイトスクリプティング(以下:XSS)の脆弱性」という言葉でしょう。

これが一体どういったものなのかを知っておくと、セキュリティ対策がしやすいかと思います。この記事では、XSSの概要について、わかりやすく説明していきます。

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

「XSS」とは、攻撃者が作った不正なスクリプトを、被害者のWebブラウザーで実行する攻撃です。

XSSには特徴があります。それは、“ユーザーが閲覧しているWebページと同じドメインで、不正なスクリプトが実行される”という点です。

XSSは、Webページに埋め込まれている攻撃用のスクリプトが、別のWebページへまたがって実行されます(横断的な攻撃)。

その性質が由来となって、「クロスサイトスクリプティング(XSS)」という名前になりました。

もともとは限定的な攻撃のことを指していましたが、一般的には上記のような攻撃全般のことを「XSS」と言います。

「クロスサイトスクリプティング(XSS)」の種類

XSSについて説明する前に、まず知っておきたいことがあります。それは、「Webブラウザー」と「Webサーバー」の関係についてです。

わたしたちは普段、Webブラウザーを使い、何気なくWebページを見ています。その間、WebブラウザーとWebサーバーは、どのようなやりとりを行っているのでしょうか。

HTTPリクエストとHTTPレスポンス

詳しくは、用語集「HTTPリクエスト」「HTTPレスポンス」の説明をご覧ください。

WebブラウザーとWebサーバーの関係をおさえたところで、XSSについて説明していきます。XSSの種類に関しては、主に以下の3つに分類できます。

反射型XSS

反射型XSSの仕組み

  1. ユーザーが、攻撃者のWebページへアクセス
  2. 攻撃者のWebページが、ユーザーのWebブラウザーに表示
  3. ユーザーがリンクをクリック
  4. このリンクは、攻撃スクリプトが埋め込まれている
  5. 結果、ユーザーが脆弱性のあるWebページに、攻撃スクリプトを送信
  6. 攻撃スクリプトが実行され、ユーザーは被害を受ける

図では、ユーザーはなんらかの形で、攻撃者のWebページへアクセスしてしまいます。

脆弱性のあるWebサーバーに、意図せずスクリプトをリクエストしてしまったので、レスポンスとして攻撃が実行されてしまう、という仕組みです。

攻撃例

  1. 攻撃者が、脆弱性のあるWebページを発見
  2. 攻撃用に作ったWebページや、メールの文書内などに攻撃スクリプトを埋め込み、ユーザーがクリックするように誘導
  3. ユーザーがクリックすると、攻撃が実行される

以下のスクリーンショットは、検証用に作ったWebページです。上の画像が攻撃用Webページ、下の画像が脆弱性のあるWebページとなっています。

「確認」ボタンをクリックすると、「test」と書かれたアラートが表示される、簡単なスクリプトを埋めこみました。

XSSのデモ

XSSのデモ

格納型XSS

格納型XSSのしくみ

  1. 攻撃者が脆弱性のあるWebページに対し、攻撃スクリプトを埋めこむ
  2. ユーザーは、脆弱性のあるWebページへアクセス
  3. 脆弱性のあるWebページが、ユーザーのWebブラウザーに表示される
  4. 攻撃スクリプトが実行され、ユーザーが被害に遭う

格納型XSSは、別名「蓄積型XSS」、または「持続型XSS」とも呼びます。あらかじめ、Webサーバー側に不正なスクリプトを保存しておく攻撃です。

脆弱性のあるWebページが、データを適切に処理しないまま、ユーザーにレスポンスを返す仕組みです。すべてのユーザーが攻撃対象となり、アクセスする度に攻撃スクリプトが実行されます。

攻撃例

  1. 攻撃者が脆弱性のあるWebページを発見し、掲示板を標的にする
  2. 「ユーザーがアクセスする度に、勝手に内容が投稿される。それが永続的に行われる」攻撃スクリプトを埋めこむ
  3. 任意のユーザーがWebページにアクセスする度、内容が掲示板に投稿される

DOMベースのXSS

DOMベースのXSSのしくみ

反射型XSS、格納型XSSは、Webサーバーを経由することで攻撃スクリプトを実行することができました。DOMベースのXSSは、Webページに含まれるスクリプトに原因があります。

つまり、Webブラウザー上・Webページのスクリプト上で、不正なスクリプトを実行することが可能です。

JavaScriptで動的なWebページを生成したいとき、推奨されていない関数を使い、適切なサニタイズ処理などを怠ると、この脆弱性が発生する場合があります。

攻撃例

  1. 攻撃者が、脆弱性のあるWebページを発見し、攻撃スクリプトを埋めこむ
  2. ユーザーがアクセスすると、攻撃スクリプトが実行される

以下のスクリーンショットは、あえて推奨されていない関数を使用し、検証用のWebページを作ったものです。

脆弱性のあるWebページのURL末尾に、「#<script>alert("警告!")</script>」などと入力しアクセスすると、アラートが表示されます。

XSSの

「クロスサイトスクリプティング(XSS)」の被害事例

反射型XSS

2010年9月、「Twitter」で、XSSの脆弱性を突いた不正スクリプトが感染を広げていました。

この手口にはJavaScriptが使われており、ユーザーがデマツイートに騙され、URLをクリックしたところ、Cookie情報が盗まれ、外部のサーバーに転送されてしまうことがわかりました。

デマツイートの内容は、「ブラジルの人気ポップバンドが事故に遭った」というもので、URLのクリック数は10万を超えていたとのことです。この脆弱性は2010年9月7日に修正されました。

格納型XSS

2008年8月、2ちゃんねるなどの掲示板を監視し、犯行予告を集積するシステム「予告.in」で、XSS攻撃によって不正コードを埋め込まれたことが判明しました。

犯行予告を通報するフォームの一部で、サニタイズ処理が行われていなかったことが原因です。結果、攻撃スクリプトを埋め込むことが可能となっていました。

「予告.in」にアクセスすると、「警視庁を爆破する 嘘です」という犯行予告文が2ちゃんねるに投稿される現象が発生していました。

他、動画やメーラーを大量に立ち上げ、Webブラウザーを強制終了させる攻撃スクリプトも埋め込まれていたようです。この脆弱性は2008年8月3日に修正されました。

DOMベースのXSS

2014年6月、米Twitterの公式クライアントアプリケーション「TweetDeck」で、XSS攻撃を受けていることが判明しました。

ユーザーがTweetDeckにログインすると、ポップアップメッセージがランダムに表示される現象が発生していたようです。

また、ユーザーの知らないところで、コードを含んだメッセージが勝手にリツイートされていることがわかりました。

原因は19歳のオーストリア人青年のようで、HTMLで「ハートマーク」を表示する実験中、脆弱性を発見したとのことです。

青年はTwitterに報告したようですが、脆弱性が修正される前に、自身の発見をオンラインで公表してしまったらしく、それを何者かが悪用したと言います。この脆弱性は2014年6月11日に修正されました。

攻撃者はどうやって攻撃を行うのか?

攻撃できるかどうか調査を行う
攻撃者は、まず、標的となったホームページを調査するところからはじめます。例えば、標的のホームページのヘッダを見たとき、セキュリティ用のパラメータが設定されていない状態だったとします。

それだけで、「セキュリティが甘い」と判断され、狙われやすくなります。

ユーザーを支配下に置くための誘導
標的であるユーザーを支配下に置くため、さらに攻撃の実行を促します。しかし、支配が続くかどうかは、標的となったユーザーの行動次第です。

Webブラウザーを閉じたり、別のWebページを閲覧したりすることで、支配から逃れることができます。

攻撃できる可能性を探る
支配下に置いたユーザーに対し、攻撃できるか否か、可能性を探ります。Webブラウザーの目的はWebページを見ることなので、当然、Webページに対する攻撃を行います。

「クロスサイトスクリプティング(XSS)」でできること

XSS攻撃を行うと、例えば、Webページを閲覧したユーザーの個人情報を盗むことができます。

また、Webブラウザーやプラグインの脆弱性と組み合わせて、ユーザーのパソコン上のファイルを破壊したり、IDやパスワードを使用し不正を働いたりと、バリエーションは多岐に渡ります。

実際にWebページを攻撃してみる

では、実際に脆弱性のあるWebページを標的にし、攻撃します。今回は、テスト用のWebページを作りました。

注意点
第三者のホームページを対象にし、許可なく脆弱性を探したり、攻撃を行ったりすると、法律違反になる可能性があります。

過去に脆弱性を発見した者が逮捕され、有罪判決を受けてしまった例があります。実際にWebページの脆弱性を探したり、攻撃を行ったりする場合、必ずご自身のホームページを対象にしてください。

攻撃を実行するまでの流れとしては、主に以下のようになります。

  • 入力フォームを見つける
  • 攻撃スクリプトを埋め込む
  • 攻撃完了

入力フォームを見つける
標的となるホームページを発見したら、まず、入力フォームがあるWebページを探してみます。お問い合わせフォーム、検索フォーム、ログインフォームなど、思い当たるところをくまなく見てみましょう。

また、Google検索で、「site:ドメイン名 キーワード」などと入力すると、入力フォームが見つかりやすくなるでしょう(例:「site:www.example.com お問い合わせ」)

上記は、「検索エンジンハッキング」という攻撃手法のひとつです。攻撃者はGoogle検索を活用し、調査を行います。

攻撃スクリプトを埋め込む

aaa">'><h1 style="font-size:200px;lineheight:300px"><a onmouseover="alert(12345678910);location.href='http://example.com/'">無料招待</a></h1>

Webページを改ざんする攻撃スクリプトを入力フォームに埋め込み、送信します。

攻撃完了
XSSのデモ
攻撃を実行することができました。本来であれば、以下のスクリーンショットのようなWebページが表示されます。

XSSのデモ

まとめ

今回は、XSSとは一体どういうものなのかを、わかりやすく説明しました。

「XSSの種類や被害事例」「攻撃者は実際どのような流れで攻撃を行うのか」について触れてきましたが、大まかに概要をとらえることができたでしょうか。

次回は、「XSSの脆弱性を対策する方法」について触れたいと思います。