目的
XSS攻撃について理解を深める。
目次
はじめに
JavaScriptはクライアントサイドで動くプログラミング言語です。
そのため、悪意のあるJavaScriptのプログラムをブラウザに埋め込めば、ユーザーにそのプログラムを実行させることができてしまいます。
今回はこのような、JavaScriptを利用した攻撃について理解を深めていきます!
XSSとは
JavaScriptを利用した攻撃方法をXSS
といいます。
XSS
とは、攻撃者が脆弱性のあるWebアプリケーション上に、悪意のあるJavaScriptのプログラム(スクリプト)を埋め込み、そのサイトの利用者を攻撃する手法です。
「スクリプトを埋め込む」とは、ユーザーがブラウザ上で表示するHTML中に、JavaScriptのプログラムを埋め込むことを言います。例えば、以下のようなHTMLがあったとします。
<!DOCTYPE html>
<html>
<div>
こんにちは
<script>alert("不正なスクリプトです")</script>
</div>
</html>
このように、悪意のあるスクリプトをWebアプリケーションを表示したときに実行させるような攻撃をXSS
といいます。
今回は例として、アラートを表示するスクリプトを埋め込みました。しかし、実際はユーザーの個人情報などを、悪意のある人のサーバーなどへ送付するスクリプトが埋め込まれることが多いです。
反射型XSS
反射型XSS
とは、悪意のあるURLをクリックすると、脆弱性のあるWebアプリケーション上でスクリプトが実行されるようにする手法です。
具体的には以下のような順序で行われます。
①ユーザーにURLをクリックさせる
攻撃者が、ユーザーに悪意のあるURL(脆弱性のあるWebアプリケーションへ遷移するURLに細工をしたもの)をクリックさせます。ユーザーにクリックさせる方法としては、メールで送付したり、掲示板などに書き込んだりすることがあります。
②ユーザーがクリックすると脆弱性のあるWebアプリケーション上でスクリプトが動く
上記の悪意のあるURLには、脆弱性のあるWebアプリケーション上で発火するスクリプトが仕込まれています。そして、ユーザーが脆弱性のあるWebアプリケーションのページを開くと、そのスクリプトが発火し個人情報を抜き取られます。
③スクリプトが発火すると、攻撃者のサーバーへ個人情報が送られる
スクリプト発火後、クリックしたユーザーの個人情報が攻撃者のサーバーへ記録されてしまいます。
この様にURLをクリックしてレスポンスがあると、即座にスクリプトが実行されることから、「反射型」と呼ばれます!
格納型XSS
格納型XSS
は脆弱性のあるWebアプリケーションの投稿などに、悪意のあるスクリプトを埋め込み、ユーザーがそのWebアプリケーションを訪れたときにスクリプトが発火するようにする攻撃手法です。
具体的には下記の手順です。
①攻撃者が、脆弱性のあるWebアプリケーションにスクリプト付きの投稿をする
フォームからコンテンツを投稿する際に、スクリプトを埋め込んで投稿をします。
②ユーザーが、その投稿のあるページを訪れるとスクリプトが発火する
スクリプトが埋め込まれた投稿のページを開くと、そのスクリプトが発火し個人情報が抜き取られます。
③スクリプトが発火すると、攻撃者のサーバーへ個人情報が送られる
スクリプト発火後、ユーザーの個人情報が攻撃者のサーバーへ記録されてしまいます。
このように、脆弱性のあるWebアプリケーションにスクリプトを格納し、ユーザーが訪れたタイミングで発火するようになっていることから「格納型」と呼ばれます。
XSSの対処法
XSSが発生する主要因として、フォームから入力されたスクリプトタグ(<script>...</script>)
などが、スクリプトとしてそのままブラウザに反映されてしまっていることがあげられます。
したがって、XSSを防ぐためには、HTMLにおいて意味を持つ「"」
や「<」
を何らかの別の文字列に変換します。この変換する際に用いられる記法を文字参照
と言います。
文字参照
とは、ブラウザ上で表示できない特殊文字を表記する際に用いられる記法です。例えば、HTML中に「<」
もしくは「>」
と記述すると、この2つはタグの「始まり」「終わり」と認識されてしまいます。
これらの特殊文字を文字列としてブラウザ上に表示するためには、文字参照
を用います。
変更前 | 変更後 |
---|---|
< | & lt; |
> | & gt; |
& | & amp; |
" | & quot; |
' | & #39; |
上の表は、XSSの対策をする際に変換すべき特殊文字の一覧です。
これらの特殊文字を文字参照
に変換して表示すれば、外部から埋め込まれたスクリプトが実行されることはありません。
Ruby on Railsにおける対処法
Ruby on Railsでは、上記で紹介したような主要な対処法についてはカバーされています。
具体的には、ビューファイルにおけるヘルパーメソッド<%= %>
です。このヘルパーメソッドを用いることで、XSSへの対策を行うことができます!