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

Tags: security, xss, javascript