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