JavaScriptでエキセントリックに関数の記述をしてみた

いえ、実践的なXSS防御の話ではないのです。どうみても役に立たないことを少しばかり。昨晩ごにょっていて個人的に面白かったので。


<script>
for(J in{to:0})for(K in{String:0})for(L in{char:0})for(M in{At:0}){{a=(198)[J+K](16)}{alert(a[L+M](0))}}
</script>
ええと、手書きで上に書いたコードが正しければ、きっと、"c"がalertされると思います。このコードを読んだだけでわかった人はエライです。
基本的にOperaFirefoxIEとで動作させたいのと…
使っていいメタキャラは最小限にしたかったので、「:」「(」「)」「{」「}」「[」「]」「+」「=」あたりで。本当は「+」「=」も使いたくないのですけれど今後の課題です。
逆に使わないメタキャラとしては、「&」「<」「>」「"」「'」「.」「,」「\」「%」「/」あたりを目標。なんてイジワルなんだ! 「.」を使えないと痛いなぁとか思ったり。それと、文字を表現するのに便利そうな「\」「%」「/」とかも禁止の方向で。

ほいでもって、何か.toString()とか何か.charAt()とかを使いたいわけですよ。このへんの工夫で結構死にました。JとKとを分離しているのは、IE対策だったりします。伊達じゃぁありません。

この後での狙いは、document.cookieをattacker.tldに飛ばすことができるサンプルですね。あとひといき。"c"がalertじゃなくて、"%"をalertできるように、まずは考えなくちゃ。脳内ではできているんだけれど。

2008/02/14追記: 脳内に浮かんでいたものよりもイイ感じのコードが作れました。ISO-8859-1で作動。「+」「=」は使わなくてもよくなったけれど、かわりに「$」を使いました。EUC-JPなら「$」は不要なんだけれども。でもまぁ「$」ってJavaScript的にはメタキャラではないのでは?結局のところ、「$」「:」「(」「)」「{」「}」「[」「]」で、「%」をalertすることができましたし、次の瞬間に「<」ほか、禁止されたメタキャラは全部alertできそうだという結論に。…できあがったコードをひとばんおいて朝見てみたら、不思議な気分に。コンカチしているおかげで、「char」と「At」が今度こそ本当に離れ離れ(はなればなれ)に。ひとばんおいた初見で読めないものになってしまいました。