Webアプリケーションに不正なスクリプトを実行させる攻撃手法ひとつに、クロスサイトスクリプティングがあります。

クロスサイトスクリプティング(Cross Site Scripting:XSS)は、動的処理を実行するWebアプリケーションや、Webページの脆弱性を悪用し、個人情報などを不正に取得します。

ここでは、クロスサイトスクリプティング(XSS)とは何か、仕組みや攻撃手法、被害に遭わないための対策方法について解説します。

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

クロスサイトスクリプティング(略称、XSS)とは、ブラウザ上においてサイト管理者の意図しないHTML(スクリプトも含む)を組み込まれる攻撃手法です。

Webサイトの動的なHTMLやJavaScriptに、悪意のあるHTML(スクリプト)を埋め込み、閲覧者が入力した情報を意図しない別のサイトに送信することが可能です。攻撃者は、Webサイトの脆弱性を利用し不正なコードの文字列を挿入します。

Webサイトの一部に不正なコードを挿入するのですが、管理者はWebサイトが改ざんされることに気づきにくく、閲覧したユーザーが影響を受ける可能性は高くなります。

クロスサイトスクリプティングの仕組み

クロスサイトスクリプティングの本質的な問題は、外部からWebサイトにHTML(スクリプト)を挿入できてしまうことです。
この脆弱性を利用して行われる攻撃は、ユーザーの入力に対して動的にHTMLページを生成するアプリケーションが対象になります。※静的なページでは、問題は発生しません。

《図解》

クロスサイトスクリプティングの攻撃フロー
  1. ユーザが悪意あるWebサイトを閲覧
  2. 出力されるWebページに悪意あるスクリプトが埋め込まれている
  3. まだそのスクリプトは効果を発揮せずに標的Webサイトへ転送
  4. 標的Webサイトの「スクリプトを排除しない欠陥」を介して、スクリプトが効果を発揮する形でブラウザへ戻ってくる
  5. スクリプトがブラウザで実行され、クッキー情報の漏洩、ファイルの破壊といった被害が発生する



クロスサイトスクリプティングの攻撃手法

クロスサイトスクリプティングは、ユーザーがWebサイトにアクセスした際に、動的に表示されるページの脆弱性を利用した攻撃です。

攻撃者は、動的ページでHTMLやJavascriptを利用している部分に悪意のある不正コードを埋め込みます。

攻撃手法は3つのタイプにわけられます。

  • Reflected XSS(反射型XSS)
  • Stored/Persistent XSS(蓄積型/持続型XSS)
  • DOM Based XSS

ここからは、上記3つの攻撃手法について説明していきます。

Reflected XSS(反射型XSS)

Reflected XSSは、HTTPリクエスト中に含まれる攻撃コードがWebページ上で動作するタイプです。代表的な攻撃パターンとしては、検索フォームなど、Getリクエストのパラメータに含まれるscriptタグがWebページ上で動作するものがあります。

特定のクエリに対してのみ動作するタイプなので、攻撃者は何らかの手段を用いて標的を特定のURLに誘導する必要があります。

ここでの「特定のURL」とは、アクセスすることで脆弱なページにPOSTリクエストを自動的に送信するページのURLを指します。

Stored/Persistent XSS(蓄積型/持続型XSS)

Stored/Persistent XSSは、HTTPリクエスト中に攻撃コードの記述があるかどうかに関係なく、あるWebページ上で持続的に動作するタイプです。

例として、掲示板などの投稿中に含まれるscriptタグがそのまま動作するものがあります。その掲示板上では攻撃者が投稿したコードが動作しているため、攻撃者は標的がそのページにアクセスするのを待てばよいだけです。

そのため、Reflected XSS(反射型XSS)に比べると攻撃成功のハードルは低いと言えます。ただし、標的がWebページにアクセスしてくれないと目的を達成することはできないため、標的を対象のWebページに誘導する必要があります。

DOM Based XSS

DOM Based XSSは、Webページに記述されている正規のscriptタグにより、動的にWebページを操作した結果、意図しないスクリプトをWebページに出力してしまうタイプです。

Webページに含まれる正規のスクリプトにより、動的にWebページを操作した結果、意図しないスクリプトをウェブページに出力してしまうタイプです。

2013年後半から急増しています。Webブラウザなどユーザー側で実行される正規のスクリプト操作を利用した不正スクリプトの実行は、webページ出力処理(DOM操作)に問題があるために可能となる脆弱性と言えます。

DOMとは
DOM(Document Object Model)は、HTMLドキュメントやXMLドキュメントをアプリケーションから操作するためのAPIである。W3Cが標準化しており、様々なプログラミング言語やライブラリがDOMをサポートしている。

出典:IPAテクニカルウォッチ「DOM Based XSS」に関するレポート~JavaScriptでHTMLを操作するアプリは要注意!~

クロスサイトスクリプティングによる被害事例は、以下の記事をご覧ください。

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

クロスサイトスクリプティングの被害内容と事例

クロスサイトスクリプティングの対策方法

HTMLテキストの入力を許可しない場合

Webページに出力する全ての要素に対して、エスケープ処理を施す

Webページを構成する要素として、Webページの本文やHTMLタグの属性値等に相当する全ての出力要素にエスケープ処理を行います。

エスケープ処理とは、HTMLやプログラミング言語を別の文字列に置き換えることです。
例えば、HTMLはタグの記述に「< 」「>」という記号を用いるとき、このままではブラウザは「タグ」として認識します。

そこで、「<」「>」という特殊な表記法に置き換えることで、「< 」「>」を文字列として認識させることができます。

このような置き換えをエスケープ処理といいます。

エスケープ文字 エスケープ処理
& &amp;
< &gt;
> &gt;
&quot;
&#39;

脆弱性防止の観点からエスケープ処理が必須となるのは、下記項目のような文字列等です。

  • 外部からWebアプリケーションに渡される「入力値」の文字列
  • データベースやファイルから読み込んだ文字列
  • その他、何らかの文字列を演算によって生成した文字列
しかし、上述した条件にあてはまるかで判断するのではなく、テキストとして出力されるすべてに対してエスケープ処理を施すことが重要です。

なお、対象となる出力処理はHTTPレスポンスへの出力に限りません。JavaScriptのdocument.writeメソッドやinnerHTMLプロパティ等を使用して動的にWebページの内容を変更する場合も、同様の処理が必要です。

URLの出力は、「http://」や「https://」で始まるURLのみを許可

URLには、「http://」や「https://」から始まるものだけでなく、JavaScriptを実行できる「javascript:」の記述で始まるものもあります。

Webページに出力するリンク先や画像のURLが、外部からの入力に依存する形で動的に生成される場合、そのURLにスクリプトが含まれていると、クロスサイトスクリプティングが可能となる場合があります。

たとえば、利用者から入力されたリンク先のURLを「<a href=”リンク先のURL”>」の形式でWebぺージに出力するWebアプリケーションは、リンク先のURLに「javascript:」等から始まる文字列を指定された場合に、スクリプトを埋め込まれてしまう可能性があります。

スクリプトが挿入されないように、URLには「http://」や「https://」から始まる文字列のみを出力する「ホワイトリスト方式」で実装してください。

<script>~</script>要素の内容を動的に生成しない

Webページに出力する<script>…</script>要素の内容が、外部からの入力に依存する形で動的に生成される場合、任意のスクリプトが埋め込まれてしまう可能性があります。

危険なスクリプトだけを排除する方法も考えられますが、危険なスクリプトであることを確実に判断することは難しいため、<script>…</script>要素の内容を動的に生成する仕様は、避けることをお勧めします。

CSSを任意のサイトから取り込めるようにしない

CSSには、expression関数等を利用してスクリプトを記述することができます。そのためサイトに置かれたCSSを取り込めるような仕様にしておくと、生成するWebページにスクリプトが注入されてしまう可能性があります。

CSSの内容を都度チェックし、危険なスクリプトを排除する方法も考えられます。しかし、手間がかかり、確実に排除することは難しいため、CSSを外部から指定可能な仕様は避けましょう。



HTMLテキストの入力を許可する場合

入力されたHTMLから構文解析木を作成し、スクリプトを含まない必要な要素のみを抽出する

入力されたHTMLテキストに対して構文解析を行い、「ホワイトリスト方式」で許可する要素のみを抽出します。ただし、これには複雑なコーディングが要求されます。また、処理に負荷がかかるといった影響もあるため、実装には十分な検討が必要です。

全てのウェブアプリケーションに共通の対策

HTTPレスポンスヘッダのContent-Typeフィールドに文字コードを指定

HTTPのレスポンスヘッダのContent-Typeフィールドには、「Content-Type:text/html;charset=UTF-8」のように、文字コード(charset)を指定できます。

この指定を省略した場合、ブラウザは、文字コードを独自の方法で推定して、推定した文字コードにしたがって画面表示を処理します。

たとえば、一部のブラウザにおいては、HTMLテキストの冒頭部分等に特定の文字列が含まれていると、必ず特定の文字コードとして処理されています。

Content-Typeフィールドで文字コードの指定を省略した場合、攻撃者がこの挙動を悪用して、故意に特定の文字コードをブラウザに選択させるような文字列を埋め込んだ上、その文字コードで解釈した場合にスクリプトのタグとなるような文字列を埋め込む可能性があります。

そのため、Content-Typeの出力時にcharsetを省略することなく、必ず指定しましょう。

管理者別に見るクロスサイトスクリプティングの対策

ユーザー側

  • 最新のブラウザにアップデートする
  • 電子メール内やWeb上の不審なURLを安易にクリックしない
  • ブラウザのセキュリティ設定により、スクリプトの実行を無効化する
  • ウイルス対策製品により、不正スクリプトを検出し、実行をブロックする
  • セキュリティ対策製品の機能により、不正サイトへのアクセスをブロックする

Web管理者側

  • 根本的な解決のためには、Webサーバ側で脆弱性に対処することが必要であり、脆弱性を作りこまれないよう、Webアプリケーション作成時から対策を意識することが必要です
  • WebサーバやWebアプリケーションのミドルウェアを常に最新の状態にする
  • 脆弱性が作りこまれないようWebアプリケーションの処理を精査する
  • WAF(Web Application Firewall)、XSSフィルタなどのセキュリティ対策製品を導入する

IT管理者側

  • エンドポイントへ総合的なセキュリティソフトを導入し、常に最新の状態にする
  • ゲートウェイ上で不正サイトへの誘導を目的とした攻撃メールの受信をブロックする
  • ネットワーク内部から外部不正サイトへのアクセスをブロックする

まとめ

クロスサイトスクリプティングとは、どのようなサイバー攻撃なのか紹介しました。

WebアプリケーションやWebページを作る人にとっては、使用するユーザーの情報を守るために知っておくべきことです。

自身が作ったサービスが悪用されないよう、セキュリティ対策はしっかりとやりましょう。

無料資料ダウンロード

自分でできるサイトのセキュリティチェック14選

自分でできるサイトのセキュリティチェック14選

無料ダウンロード

ホームページ健康診断

ホームページ健康診断

無料ダウンロード




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