さきに示したような攻撃を防ぐため、スタイルシートを許容するようなWebアプリケーションでは、HTMLだけでなくスタイルシート部分についても、安全な内容を生成するように注意しなければなりません。
ところが、IEは残念なことに、スタイルシートの解釈が非常にあいまいです。そのため、単純に「expression」という表記をフィルタリングするだけでは、XSSを防ぐことができません。
例えば、以下のような記述では、すべてJavaScriptを実行してしまいます。
(1)通常の表記
<div style="left:expression( alert('xss') )">
(2)コメントの挿入
<div style="left:exp/* */ression( alert('xss') )">
(3)バックスラッシュによるコードポイント指定
<div style="left:\0065\0078pression( alert('xss') )">
(4)数値文字参照
<div style="left:expression( alert('xss') )">
(インラインでのスタイル定義では、数値文字参照が利用可能)
これらに加えて、IE6では以下の記述であってもスクリプトが動作します。
(5)全角文字
<div style="left:expression( alert('xss') )">
(6)特定のUnicode文字
<div style="left:expRessioN( alert('xss') )">
(R は U+0280、N は U+0274 または U+207F が利用可能)
もちろん、(1)から(6)の記述は組み合わせて書くこともできるため
<div style="left:\65x/**/pression( alert('xss') )"> |
という表記でもJavaScriptは動きます。また、IE6では「expression」以外にも
<div style='background-image:url("javascript:alert(/xss/.source)")'> <div style='background-image:u/**/rl("javascript:alert(/xss/.source)")'> <div style='background-image:\0075rl("javascript:alert(/xss/.source)")'> |
のように、URLとしてjavascriptスキームを記述した場合にもスクリプトを動作させられます。
Copyright © ITmedia, Inc. All Rights Reserved.