webアプリケーションの脆弱性-XSS(クロスサイトスクリプティング)とは


Webアプリケーションの脆弱性の中で最も問題視されているのが、クロスサイトスクリプティング(以下、XSS)です。
XSSとは、html中に特殊記号を含むスクリプトタグをユーザーが入力できるフォーム等に書き込むことで、任意のスクリプトが実行され、ユーザーのなりすましやセッションハイジャックを行う攻撃のことです。

例えば、、、、

下記のような入力フォーマットに書き込むと書き込み欄の下部にその書き込み内容が表示される掲示板サイトがあったとします。

この掲示板にXSSの脆弱性を発見した攻撃者が以下のようなスクリプトタグを書き込みます。

filename
<script>
window.onload=function(){
    location.href="http://otomeshinto.com/?aid=282";
};
</script>

このスクリプトはこのページがロードされた時に、スクリプトで指定されたサイトへ飛びます。
書き込み後は、、、、

となり、スクリプトタグがhtml中に埋め込まれてしまったため、
実際に書き込んだ内容が表示されておりません。
この書き込み後、当該ページをリロードすると、スクリプトで指定した
http://otomeshinto.com/?aid=282
のページに強制的に飛ばされてしまいます。

これがXSSの原理です。

書き込んだスクリプトタグはエスケープ処理をしないと、
ただの文字列として認識されず、
JavaScriptとしてhtml上に埋め込まれてしまって、
JavaScriptが実行され指定された別ページに飛んでしまうのです。

これぐらいであれば可愛いものですが、
個人情報を扱うサイトでこのような脆弱性が発見された時、
このxssの脆弱性によって、情報漏えいの問題があり、甚大な被害となります。

具体例-フィッシング・情報漏えい

あるXSSの脆弱性を孕む「ネットショッピングサイト」があったとします。攻撃者が事前に商品を決済する際に当該ネットショッピングサイトに似た偽サイトの決済ページに誘導するようなスクリプトタグを埋め込みます。
例えば以下のようなスクリプトタグです。

filename
<script>
window.onload=function(){
    location.href="偽サイトの決済ページ";
};
</script>

偽サイトの決済ページでは名前、送り先住所、メールアドレス、電話番号、クレジットカード番号等の個人情報の入力欄があり、ユーザーは偽ページであると気づかずにそのまま個人情報を入力すると攻撃者に個人情報を抜き取られてしまします。このように個人情報やクレジットカード番号が抜き取られると、見覚えのない膨大な請求がくる等の問題になります。

では、どのような対策があるか。
さっと記述します。

・危険文字(<,>,",',&等)をエスケープする
上記の危険文字を文字列として認識させる処理をします。
スクリプトタグの埋込みをさせないようにします。

・入力値チェックを行う(サーバー側で)
そもそも危険文字が入力されようとした際には弾くようにします。
サーバー側でと明記したのは、クライアント側の入力値チェックだと、
例えば、javascriptはwebブラウザの設定で無効にできるためです。

・フレームワークを活用する
全てのパラメータで入力値チェックを行うのは大変で漏れる可能性がある。
そのため、フレームワーク等の活用で低コストで対策を行うことができる。

上記、ざっくりと対策を記述しましたが、
XSSは対策上限界があるのも事実です。
それはエスケープしてはならない場面があることや制限をかなり課した入力値チェックはユーザービリティーを損ねてしまい、ユーザーの業務効率の低下を招く恐れがあるためです。ビジネスルールを明確にし、的確な対策を行うことが大切です。