まだ重たいCMSをお使いですか?
毎秒1000リクエスト を捌く超高速CMS「adiary

2006/09/11(月)CSSXSSの問題

CSSXSSとは?

IEがCSSではない{を含む*1テキストをCSSと見なしてインポートしてしまい、あろうことかそのテキストがJavaScriptから操作可能なために発生するセキュリティーホールです。IE5、IE6などに存在します。

検証用コード。

<html><head>
<title>CSSXSS</title>
<style type="text/css">
@import url("./cssxss.txt");
</style>
</head><body>
<h1>CSSXSS</h1>
<textarea rows="20" cols="80" id="cssxss"></textarea>
<script type="text/javascript">
var text = document.getElementById( "cssxss" );
text.innerText = document.styleSheets(0).imports(0).cssText;
document.write("test")
</script>
</body></html>

この例では、cssxss.txt が「{」を含む場合、その中身を<textarea>に表示します。

悪意のあるサイトにアクセスした第3者に対し、既知のURL(例えばmixiなど)へユーザー自身にアクセスさせその結果をJavaScripを用いることで攻撃サイトに送信するなどという使い方をします。BASIC認証、Cookie認証その他あらゆる認証により守られたページも、ユーザー自身にアクセスさせることで突破できてしまうという驚異のセキュリティーホールです。

有効な対策

有効な対策は2つ。1つは、CSSXSSの攻撃をされたくないあらゆるページにおいて{」を「&#123;」にエンコードして出力することです。

もう1つはIE系ブラウザ((IEエンジンを使用するブラウザ))のアクセスを拒否することです。個人的には後者を選びたいのですけど(笑)

*1 : この文字だけであることIE6で確認しました。Shift JISの場合は2バイト目に { を含んでも同じ