クロスサイトスクリプティング対策

投稿日:2007.03.01

ここまで、いろいろな文字化けパターンについて考察してきました。これらの多くは(マイナー)ブラウザのバグによるもので、「仮に圧倒的多数である Windows版IEユーザーがまともに見ることができるならば、他のブラウザで見た場合に多少文字化けしたところで、構わない」というスタンスもありえなくありませんでした。また、実際、そういうサイトも多いです。

ところが、実は文字コードの処理を誤ると思わぬセキュリティホールが起こりえます。代表的なものはクロスサイトスクリプティングです。クロスサイトスクリプティングについて簡単に説明しますと、ユーザー入力などにより動的に生成されるページがあったとします。

070301_xss01.jpg「田中 太郎」という入力値であれば問題ありませんが、「田中 太郎」という入力値の場合、どうなるでしょうか?


もし、名前を表示する側のプログラムで適切な処理(HTMLタグやJavascriptコードの無効化。『サニタイジング』と呼びます。)を行っていなかった場合、そのままHTMLタグが実行されますので、赤い文字で名前が表示されます。これぐらいの話であれば、「裏技」ということで処理できるでしょうが、実際はセッション・ハイジャックなどの危険性があります。Javascriptもそのまま実行されるためです。クッキーを利用したセッション管理はよく見られる手法ですが、このHTMLタグの無効化処理の失敗による脆弱性を利用することで(クロスサイトスクリプティング Cross Site Scriptingと言います。略してCSS問題とも呼びますが、スタイルシートのCSSと紛らわしいので、XSS問題とも呼びます。)、他人のクッキーを盗み出すことが可能です。

何も知らないユーザーAが、悪意のあるユーザーBが巧妙に仕組んだURLをクリックすると、そのサイトで発行されているクッキーが、Bの管理するリモート・サーバに送信させることが可能になるのです。仮にクッキーだけで認証しているとするならば、後は、Bは自力でそのクッキーを焼いて、そのサイトにアクセスすれば、Aになりすますことが可能になります。詳しくは、下記のサイトを参照してください。


070301_xss02.jpgでは、このHTMLタグの無効化(サニタイジング)はどうすればいいかといいますと、皆さんご存知のように、左の表のように置換すれば良いことになります。これは、下記のような文字化け を悪用した攻撃にも効果的です。

例えば、「<」は16進文字コードで「0x3C」です。確かに、「<」で表示される文字(1バイト)なら、Shift_JISでもEUC- JPでもJISでも文字コードは一緒でしょう。しかし、もし「0x3C」を2バイト文字(漢字)の一部であると解釈すればどうでしょうか? Shift_JISやEUC-JPには幸い「0x3C」は現れませんが、JISには現れます。

例えば、「紗」という漢字は、Shift_JISでは0x8ED1ですが、JISでは0x3C53です。0x3C53は、Shift_JISやEUC- JPでは、「1バイト文字が二つある」としか解釈できまず、この場合、「0x3C=<」「0x53=S」となります。つまり、JISコードの「紗」がShift_JISやEUC-JPと解釈されると、「


JISコードでPOSTするのはいとも簡単です。元もとの入力フォームがShift_JISであったにせよEUC-JPであったにせよ、それをローカルに保存する際にJISで保存します。保存したファイルのメタタグをJIS(ISO-2022-JP)に書き換え、formタグのaction先をhttp~に書き換えればJISコードでPOSTできてしまいます。ユーザーからのデータ入力が、こちらが想定したページからの送信であるという保証はありません。 refererのチェックも対処策の一つですが、refererは偽造が容易である上に、Norton Internet Securityなどの製品を使っている善意のユーザーをはじく可能性があり、あまりお薦めできません。

攻撃者は、JISでPOSTできる仕組みを準備できたら、後は、EUC-JPとして解釈した場合に「