yamory Blog

クロスサイトスクリプティング(XSS)とは?Webアプリにおける対策方法について

クロスサイトスクリプティング(Cross Site Scripting)
Webアプリケーションに対しての攻撃手法のひとつであり、略してXSSと呼ばれています。
本記事では、このクロスサイトスクリプティングの被害についてと、攻撃の種類について解説していきます。

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

クロスサイトスクリプティングは、Webアプリケーションにおける脆弱性のひとつです。ユーザーの入力内容によって表示が動的に変わるページにおいて、システムの表示処理の不備から引き起こる脆弱性で、攻撃手法のひとつとして言及することもあります。

クロスサイトスクリプティングという名前が表すように、サイトを超えて任意のコード(主にJavaScript)を実行できる、クライアント側のコードインジェクション攻撃です。

xss structure

どのような影響・被害が発生するのか

任意のJavaScriptコードを実行できることから、JavaScriptで操作できることはすべて実現できてしまい、サイトの利用者に対して悪い影響を及ぼします。
代表的な例を以下にご紹介します。

クッキーの情報を抜き取ることができてしまう

クッキー内にセッションIDが入っていればその値を取得することができ、なりすましが可能になります。

HTMLの内容を書き換えることができてしまう

ユーザーが入力するフォームの送信先を別のURLに書き換えることで、フォームの入力内容を別のサイトに送信することができてしまいます。
まったく別のサイトのコンテンツを埋め込んで表示することで、違和感なくフィッシングサイトに誘導することが可能になります。

故意に通信を実行できる

ajax(非同期で通信できる技術)を用いて、内部ないし外部のサイトにデータの受け渡しができます。ユーザーが意図しない処理をユーザーに気付かれないように実行することが可能になります。

以上、代表的な3つをご紹介しましたが、この3つを組み合わせることでログインしているセッションを悪意ある攻撃者の手に渡すことができたり、ユーザーが入力したフォーム内容を攻撃者が関係するサーバに送信することができてしまうのです。

どのくらい発生しているのか

クロスサイトスクリプティングの脆弱性はどのくらい発生しているのでしょうか。

情報処理推進機構(IPA)が四半期ごとにとりまとめている「ソフトウェア等の脆弱性関連情報に関する届出状況」から2019 年第 4 四半期(10 月~12 月)の資料を見ていきましょう。
この資料では、ソフトウェア等の脆弱性に関する取扱状況から、脆弱性の種類別の内訳が公開されています。

内訳のうち「ウェブサイトの脆弱性の種類別の届け出状況(10,496件)」において、Webサイトで最も多く発生している脆弱性が「クロスサイトスクリプティング」となっており、他の脆弱性よりも群を抜いて発生していることがわかります。

vulnerability type report
ウェブサイトの脆弱性の種類別の届出状況(IPAの資料より引用)

また続いて「ウェブサイトの脆弱性がもたらす影響別の届出状況」という資料においても「本物サイト上への偽情報の表示」が56%と大きな割合を占めています。

vulnerability impact report
ウェブサイトの脆弱性がもたらす影響別の届出状況(IPAの資料より引用)

「本物サイト上への偽情報の表示(56%)」「データの改ざん、消去(11%)」「サーバ内ファイルの漏洩(4%)」「個人情報の漏洩(4%)」「なりすまし(2%)」「Cookie情報の漏洩(2%)」は、クロスサイトスクリプティングの脆弱性から発生するものです。

このように、種類別割合・影響別の比率から見ても、クロスサイトスクリプティングは引き起こしやすく、Webに携わる運営者・開発者が注意しなければいけない脆弱性なのです。

どうして発生するのか

クロスサイトスクリプティングは、なぜこれほどまで容易に発生しやすい脆弱性なのでしょうか。

それは、ユーザーが入力可能な部分(URLやフォームなど)の文字列をページ内に表示する部分において、本来文字列として表示すべきところエスケープ処理が適切に行われていないことで、JavaScriptの実行を許してしまうことに起因しています。

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

もう少しクロスサイトスクリプティングについて深堀りしていきましょう。
クロスサイトスクリプティングには、一般化された種類分けはありませんが、大きく分けると2種類(反射型、持続型)に分類されます。

反射型XSS(Non-Persistent XSS)

もっとも一般的な種類のクロスサイトスクリプティングです。
ユーザーが入力可能な部分(いわゆるURLであったり、フォームのリクエストボディ)に、スクリプトコードをテキストとして入力して送信します。
本来であればユーザーが入力したコンテンツを表示する際に、コンテンツのサニタイズ処理を施さずに表示処理を行ってしまうと、Webブラウザ上でスクリプトコードが実行できてしまうものです。

DOM Based XSS

反射型XSSのサブカテゴリーとして、DOM Based XSSというものが挙げられます。

昨今のWebアプリケーションでは、ページ全体を都度読み込むのではなく、ページの一部分を書き換えていく技術が用いられるようになってきました。著名なSNSであるFacebookやTwitter、Pinterestでも用いられており、インタラクティブな操作性・体験が提供されています。

このページの一部分を書き換える際に、ユーザーがスクリプトコードを含んだコンテンツを画面上に表示したいところ、表示処理の不備からスクリプトコードが実行されてしまうものをDOM Based XSSと呼称しています。

反射型XSSはサーバサイド側のアプリケーションコードの実装不備で発生するものでしたが、DOM Based XSSはフロントエンド側のアプリケーションコードの実装不備で発生するものになります。

持続型XSS(Persistent XSS, Stored XSS)

攻撃者がスクリプトコードを含んだコンテンツをサーバに送信した結果、アプリケーション側のデータベース等のストレージにコードが格納されてしまい、不特定多数のユーザーが時間が経って攻撃できてしまうものを「持続型」と呼称しています。

攻撃用コードがWebアプリケーション側に格納されてしまうことで、ユーザーがアクセスする度にコードが実行されるため、被害が拡大する傾向にあります。
多くのユーザーが日常的に使う個人情報が多く含まれるWebアプリケーション、例えばWebメーラーやSNSで仕掛けられやすい傾向にあります。

どういった対策をすれば良いのか

これほどまでに発生しやすいクロスサイトスクリプティングという脆弱性を防ぐために、Webサイト・Webアプリケーションのエンジニアや管理者はどのような対策をすれば良いでしょうか。

種類や攻撃手法を紹介しましたが、いずれも共通するのは「ユーザーが入力した文字列を表示処理する際の、不備・考慮漏れによって引き起こる脆弱性」であることです。

つまり、表示処理に関わる部分のコードを修正することが対策となります。
以下、大まかな対策、修正方針をご紹介します。

1. アプリケーションコードでエスケープ(サニタイズ、サニタイジング)処理を実施する

HTMLコードを表示する際に、HTMLの文法で特別な意味を持つ特殊記号 < > & / があります。いわゆるタグ(要素)や属性の値としてWebブラウザが認識・解釈する記号です。この文字を純粋に文字列としてページ上で表示するためには、以下のようにエスケープ(サニタイズ、サニタイジング)処理を行うことで、スクリプトコードが無害化され、実行されることを回避できます。

対象となる文字 エスケープ処理後の文字
< &lt;
> &gt;
& &amp;
" &quot;
' &apos;
/ &#x2F;

昨今のWebアプリケーションやライブラリでは、このエスケープ処理が自動的になされるケースが一般的ですが、ある一部分においてはHTMLを表示したいユースケースもあるかと思います。この一部分のユースケースにおいて、ユーザーが入力可能な値が注入可能な実装になっていると、クロスサイトスクリプティングの脆弱性が発生します。

まずはHTMLのマークアップとして正しいHTMLが出力されるようにしましょう。

2. バリデーション処理を実施する

先ほどのエスケープ処理は画面の表示という、出力部分についての対策でした。
もう一方、ユーザーが入力できる値についても制限を施すことも対策のひとつです。
主にフォームの各入力項目や、URLのパス/クエリパラメーターについてもバリデーションチェックを施しましょう。

3. フレームワーク・ライブラリは最新版にアップデートする

上記 (1) (2) については、主に開発者が実装したアプリケーションコードにおける部分でしたが、同様にフレームワークやライブラリ内のコードについても、クロスサイトスクリプティングの脆弱性が含まれている可能性があり、適宜対策を実施する必要があります。

現在利用しているソフトウェアとそのバージョンは把握しておきましょう。
Webアプリケーションであれば、フレームワークおよびライブラリを、Webサイトでしたら利用しているコンテンツ管理システム(CMS)を最新版に保つようにしましょう。

以上、大きく3項目に分けて対策方法をご紹介しましたが、XSSの攻撃手法はたくさんあります。
OWASPより「Cross Site Scripting Prevention Cheat Sheet」が公開されていますので、対策やテストを実施する際には是非ご一読することをお勧めします。

最後に

クロスサイトスクリプティングはWeb開発者のみならず、Webサイトの運営者も必ず注意を払うべき脆弱性であり、また適切な対策を行えば防ぐことができる脆弱性です。

正しいHTML構文(マークアップ)が出力されることを意識することが、クロスサイトスクリプティング対策における意識付けであり、解消へ向けての第一歩となります。

稼働中のWebサイト・Webアプリケーションに対して、クロスサイトスクリプティング対策を実施するのは大変な労力がかかります。また、脆弱性が見つかっても開発やビジネスの優先度から対策が後回しになったり、放置になるケースもあるのではないでしょうか。
ご利用のユーザーや顧客に被害が発生する前に、継続的にリソースを確保して対策を実施していきましょう。

一方で、新規開発時においては、クロスサイトスクリプティング対策を意識して実装を行うことで対処できるため、労力という点でははるかに簡単にできます。Webに携わる開発者・管理者として、セキュア開発を意識しながら開発を進めていくことが大切です。

最後になりますが、Webアプリケーションで用いられるフレームワーク・ライブラリに潜むクロスサイトスクリプティングの脆弱性については、yamoryを用いることで検出が可能です。ぜひ一度お試しいただければ幸いです。

オープンソース脆弱性管理ツール yamory

  • 利用中のOSSを抽出し
    脆弱性を自動スキャン
  • 脆弱性への対応優先度を自動で分類
  • 組織規模に合わせたプランを選択可能

フリー

¥0

個人向け

1件ずつ Immediate な脆弱性を管理

1チームまでの開発チーム作成

yamory を使いはじめる

プロ

有料料金はお問い合わせください

中〜大規模組織向け

無制限で Immediate な脆弱性を管理

無制限の開発チーム作成

開発チームを俯瞰できるセキュリティチーム機能

危険な脆弱性の Slack 連携通知機能

特定のソフトウェアの脆弱性一覧を表示

特定の脆弱性を含むソフトウェア一覧を表示

30日間の無料トライアルを開始