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

2019.04.08

Webセキュリティ

cross-site-scripting

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

目次

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

クロスサイトスクリプティング(XSS)とは、掲示板サイトやTwitterのような、ユーザからの入力内容をWebページに表示するWebアプリケーションにおいて、ウェブサイト(標的サイト)の脆弱性(XSS脆弱性)を利用した攻撃手法を指します。
攻撃者は、入力内容に、スクリプト付のリンクを貼る等の罠を仕掛けます。被害者となるユーザが誤って罠を実行する(リンクをクリックする等)と、セキュリティ的に問題のある別のウェブサイト(クロスサイト)に対し、脆弱性を利用した悪意を持った実行内容(スクリプト)が含まれた通信が実行されます。その結果、偽のページがユーザに表示され様々な悪影響を引き起こします。例えば不正なポップアップが出たり入力フォームが立ち上がったりするときは要注意です。
偽ページでは個人情報など重要な情報の入力を促す内容や、ブラウザ上から取得可能なユーザコンピュータ上の情報(Cookie等)を取得する作りとなっていて、このスクリプトが実行されると、ユーザーの個人情報が流出したり、マルウェア感染するなど様々な被害が発生します。

被害者にならないための対策としては、いつも利用しているサイトであっても表示内容に注意し、安易にクリック・情報入力しないことですが、攻撃者側は言葉巧みにクリックさせたり、情報入力させたりと工夫するため、ユーザ側に頼ることは完全には難しいのが現状です。

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

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

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


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

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

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

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

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

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

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

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

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

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

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

おススメはクラウド型WAF

Webアプリケーション層を保護することが出来るWAFは、Webサービスには不可欠です。さらにクラウド型WAFであれば、コストや手間も少なくセキュリティ対策することができます。クラウド型のWAFは導入ハードルが極めて低いので、これからWebセキュリティ対策を行う企業様には有力な選択肢となります。WAFを選定する時には、サポート体制や導入実績なども重視して、自社に最適なものを選びましょう。

クラウド型WAF「攻撃遮断くん」は、最新の攻撃パターンにも自動的に対応していくため、セキュリティパッチをすぐに適用できない状況や、定期的に脆弱性診断が出来ない状況でも、セキュアな環境を保てます。ぜひこの機会にWebセキュリティ対策を見直し、WAFの導入を検討してみてください。

「攻撃遮断くん」の詳細資料は、こちらからダウンロード頂けます。

(2017/12/5 執筆、2019/4/8修正・加筆)

この記事と一緒に読まれています