クロスサイトスクリプティングのセキュリティ対策とは?

2017年12月5日(火) ノウハウ

<ちょい読み>
・Webアプリケーションの脆弱性を利用したクロスサイトスクリプティング
・入力値の制限やサニタイジングをすることでクロスサイトスクリプティングを防ぐ
・WAFを導入することでより強固なWebアプリケーションにする


Webアプリケーションへのサイバー攻撃手法として、代表的な攻撃であるクロスサイトスクリプティングですが、対策を行うことで危険を回避することができます。
今回はクロスサイトスクリプティングの対策方法について解説していきます。

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

クロスサイトスクリプティングとは、掲示板サイトのような、ユーザからの入力内容をWebページに表示するWebアプリケーションにおいて、情報入力チェックの不備を利用した攻撃手法を指します。
入力内容に罠を仕掛け、ユーザが誤って罠を実行すると、別のセキュリティ的に問題のあるウェブサイト(クロスサイト)に対し、脆弱性を利用した悪意を持った実行内容(スクリプト)が含まれた通信が実行されます。実行された結果、偽のページがユーザに表示され様々な悪影響を引き起こします。
偽ページでは個人情報など重要な情報の入力を促す内容や、ブラウザ上から取得可能なユーザコンピュータ上の情報(Cookie等)を取得する作りとなっていて、このスクリプトが実行されると、攻撃者へ情報が流出するようになっています。
ユーザ側の対策としては、いつも利用しているサイトであっても表示内容に注意し、安易にクリック・情報入力しないことですが、攻撃者側は言葉巧みにクリックさせたり、情報入力させたりと工夫するため、ユーザ側に頼ることは完全には難しいのが現状です。

クロスサイトスクリプティングが起こる原因

ごく単純な掲示板Webアプリケーションを例に、基本的な動作から説明します。
例となる掲示板アプリケーションは、以下のような処理の流れを想定します。

①投稿内容を入力するページが表示され、ユーザが投稿内容を入力し、「確認」ボタンをクリックする。
②投稿内容の確認画面が表示され、ユーザは問題ないと判断したら、「投稿」ボタンをクリックする。
③投稿内容登録処理が実行され、登録完了すると、投稿完了画面が表示される。



次に、攻撃者が悪意ある投稿内容を入力するとどうなるでしょうか?
例にあげたアプリケーションは入力内容を一切チェックしていないので、攻撃者はどんな文字でも入力可能となっています。
この結果、攻撃者は投稿内容欄にブラウザ画面で処理可能なコマンドを含む文字列で罠画面内容を入力できてしまいます。具体的にはHTMLでできたドキュメントと、HTMLに埋め込む形のスクリプト(JavaScriptが一般的)です。
例えば、攻撃者は罠となるHTMLドキュメントを掲示板サイトに入力して、以下のような画面を表示できるようになります。

「はい」「いいえ」ボタンには【スクリプト1】が仕組まれており、標的サイトにある偽ページへ誘導するようになっています。
偽ページは攻撃内容を含む【スクリプト2】の実行を促す仕様になっているため、ボタンをクリックすると、入力内容やCookieを盗まれることになります。
以上のことから、クロスサイトスクリプティングが起こる原因は以下の2つであるといえます。

①入力値が制限されていない
②HTMLやJavaScriptなどのスクリプトが入力された場合、その内容をそのまま実行してしまう


では、これらに対して、どのような対策をすればよいのでしょうか。

クロスサイトスクリプティング対策①入力値を制限する

クロスサイトスクリプティングの対策方法一つ目は入力値の制限です。
例えば、郵便番号の入力では、数字以外は入力を許可しないような作りにしておけば、スクリプトを入力されることはできなくなります。
また、文字種の制限ができなくても、入力値の長さに制限があれば、クロスサイトが可能となるスクリプトを埋め込むことをある程度制限することが可能です。
その場合、入力値の制限は必ずサーバ側で実行しましょう。なぜなら、ブラウザ側でJavaScriptを使い入力チェックを行う方法の場合、クロスサイトスクリプティング対策としてではなくユーザのチェック用としてしか機能していないためです。
ブラウザ側での入力値の制限だけでは、実行前の画面を、入力チェックスクリプト部分を無効化した内容に修正して、その画面で実行することが可能なためクロスサイトスクリプティングの対策としては不十分です。
必ずサーバ側での制限設定を実行を行いましょう。

クロスサイトスクリプティング対策②サニタイジング(スクリプトの無害化)

クロスサイトスクリプティングの対策方法二つ目はサニタイジングです。
クロスサイトスクリプティングはフォームに実行可能な文字列を挿入することで、悪意のある操作を実行するものです。
これらの文字列を実行させないようにサニタイジング対策を施すわけです。
例えばという文字列を含む場合は、JavaScriptなどのスクリプトが実行されます。このように、スクリプトが必要とする&,<,>,”,’の5文字の特殊文字に着目します。これらをそのまま画面に表示する文字列となるように置換(エスケープ)します。このようにすれば、スクリプトが入力されても、画面にはスクリプトのソースが表示されるだけで、攻撃者が意図する画面が表示されなくなります。

しかし、この手法はスクリプトの実行を阻止しているだけで、結果としては攻撃者からの攻撃をかわしているだけです。
さらにこの攻撃自体を防御することで、防御を強固にしたいところです。その場合、WAFが必要となります。

クロスサイトスクリプティング対策はさらにWAFで防御

これら二つの対策はともにWebアプリケーション作成の段階で対応されるものです。
しかし、人が作成するもののため、見落としがある可能性があります。
クロスサイトスクリプティングを防ぐためにWAFの導入をするとなお良いでしょう。
万が一Webアプリケーションの入力チェックに漏れがあり、クロスサイトスクリプティングが可能となるような作りになっていたとしても、WAFがあれば防御することが可能です。
なぜなら、WAFはユーザからのリクエスト内容をチェックしているためです。
先にあげた2つの対策をするだけやWAFを導入するだけ、ではなく両方とも導入して安全性をより高めることが大切です。

Writer:SecurityTIMES編集部