Asial Blog

Recruit! Asialで一緒に働きませんか?

DOM-based XSS

カテゴリ :
フロントエンド(HTML5)
タグ :
JavaScript
セキュリティ
ようやくアシアルに馴染んできました坂本です。

今回はWebアプリケーションのセキュリティのお話です。
Webアプリケーションのセキュリティと聞くとサーバサイドスクリプトの脆弱性と思われがちです。
年々攻撃手法は多様化しHTML5とJavascriptだけのWebアプリケーションでも脆弱性は発生します。

例としてありがちなリダイレクトページとその問題です。
リダイレクトの方法はいくつかありますが簡易的なものの一つにリダイレクト先のURLをハッシュパラメータ(#マーク以降のパラメータ)で渡し、Javascriptを使ってリダイレクトさせる方法があります。

下記が脆弱性を含むリダイレクトするコードです。

  1. <script type="text/javascript">
  2. var redirectUrl = decodeURIComponent(window.location.hash.slice(window.location.hash.indexOf( "?url=" ) + 5));
  3. if (redirectUrl) window.location = redirectUrl;
  4. </script>

このコードをindex.htmlに仕込んで下記のようにハッシュパラメータを付けてアクセスしてください。

http://localhost/index.html#redirect?url=javascript%3aalert%28%22XSS%22%29%3b

するとビックリほど簡単にアラートが表示されます。
そうです、これがクライアントサイドで完結してしまうDOM-based XSSと呼ばれる脆弱性の1例です。

ハッシュパラメータに仕込まれた悪意のあるJavascriptコードがブックマークレットのようにwindow.locationを使ってアドレスを書き換えられることでXSSが発動します。
この攻撃手法を使えば好きなコードを走らせることができるのでCookieの値を外部のサーバに送ることが可能です。

この手法は意外と検出が難しいという問題もはらんでいます。
ブラウザの仕様上、ハッシュパラメータはサーバに送られる事がないためサーバサイドに高価な攻撃検出ツールがあったとしても検出することができません。

攻撃検出するツールが進化してこのような脆弱性を診断できるようになるまでは開発者は気をつけて実装しれなければいけません。