[柔軟すぎる]IEのCSS解釈で起こるXSS:教科書に載らないWebアプリケーションセキュリティ(3)(2/3 ページ)
XSSにCSRFにSQLインジェクションにディレクトリトラバーサル……Webアプリケーションのプログラマが知っておくべき脆弱性はいっぱいあります。そこで本連載では、そのようなメジャーなもの“以外”も掘り下げていきます (編集部)
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:expression( alert('xss') )">
(インラインでのスタイル定義では、数値文字参照が利用可能)
これらに加えて、IE6では以下の記述であってもスクリプトが動作します。
「expression」表記方法(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)の記述は組み合わせて書くこともできるため
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
という表記でもJavaScriptは動きます。また、IE6では「expression」以外にも
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
のように、URLとしてjavascriptスキームを記述した場合にもスクリプトを動作させられます。
Copyright © ITmedia, Inc. All Rights Reserved.