IE7のセキュリティその1:ブラケット無しXSS
ちゃんと確認できてないのですが、どうもIE7では、CSSのURL値指定でjavascriptスキームのURLを指定できなくなったみたいです。
IE6では、CSSで
background: url(javascript:~~~);
とか書くと、中のJavaScriptが動いていました。
この仕様の何が問題かと言うと、クロスサイトスクリプティング対策が不十分なWebアプリケーションで脆弱性となる場合があるからです。
例えば、リクエストでHELLOという値が与えられた際に、次のようなinputタグを出力するアプリがあるとします。
この場合、もしXSS対策が何も考えられていない(サニタイズしていない)場合、
">
と入力されると
">
となって終わりです。
そこで対策としてサニタイズが必要になるわけですが、このとき、「」だけをサニタイズして安心していると、
" style="background:url(javascript:alert('XSS'))
とやられ、
となって、IE6まではこれでスクリプトが動いてしまっていました。
どうも属性値では「"」をサニタイズしないフレームワークがあるっぽいです。この問題は、一見「ちゃんとXSS対策しているよ!」というサイトで、たびたび見受けられます。
ちなみにIE7でも、これ↓は受け入れて動いてしまうようです。結局ダメなんじゃん。ということで。
style="xss:expression(javascript:alert('xss'))"
というわけで、サニタイズは少なくとも「」「"」「&」これらに対して適切に行いましょう。これはIEの変な仕様が悪いわけでもなく、アプリ側の責任です。