CSSXSSを改良した?手法でmixiのpost_keyを抜き取るデモを作りました

IDを抜き取る方法が思いつかなかったので、「はまちちゃん」の書き込みの二年来の再来とはいきませんが、セキュリティーホールだと思うので、早めに書いておきます。(修正済みです)

実証コード

http://k75.s321.xrea.com/cssxss/mixi.html

パッチ済みのIE6でmixiにログインしていた場合、post_keyの取得を確認できると思います。勘違いだったらすみません。その際、僕のmixiのあしあとに残るのでその点のみ注意してください。

手法

CSSの読み込み

いわゆるCSSXSSと同じようにlinkを使って、ファイルを読み込みます。旧来の手法では中括弧があることでCSSと誤認識させ、cssTextで取得しましたが、今回は文中に「}selector{property:」という文字列を埋め込んで、selectorに該当する要素のcurrentStyle.propertyを参照することで外部ドメインのテキストの一部(複数その文字列が入った場合、一番最後のプロパティーだけとなりますから)を参照しました。propertyにcolorなどはどうも勝手に正規化されるようなので、多くのプロパティーは使えませんが、確認している限り、font-familyとquotesはそのまま以降の文字列を認識するようです。

今回はmixiのニックネームに「}a{quotes:」と設定することにより、メッセージ入力画面からpost_keyを取得することができました。

中括弧のエスケープ突破

mixiの場合、CSSXSS対策のため、「}a{quotes:」と入力しても実際には「}a{quotes:」とされてしまいます。この対応のために入力文字列はUTF-7エンコードした「+AH0-a+AHs-quotes:」として、UTF-7のファイルから読み込むことで、上記のCSSの誤認識を行わせることができます。

対策

中括弧とプラス記号をエスケープすれば、よいと思います。現在、プラスをエスケープどころか、中括弧をエスケープしていない場合の方が多いので、多くが攻撃の対象となる可能性がある気がしました。

脆弱性通報

さっとググってみましたが、どこにすればいいのかわかりませんでした。あとで暇ができたら、電話するなりして聞いてみようと思います。