ちょっと面白いjavascriptコード

このエントリーをはてなブックマークに追加
はじめまして、技術部のou.gと申します。先月の中旬に中途として入社しまして、QAチームに配属となりました。

最近は弊社のサービスSHANON MARKETING PLATFORMのXSS対応テストを担当しています。最初にXSSを調べた時に、このPDFの40ページ目に乗っているちょっと面白いソースコードを見つけていました。すでにご存知の方も多いかもしれませんが、みなさんとシェアしたいと思います。

記号だけ英数字の使わないjavascript:

・コード1
($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!''+$)[_/_]+$_[+$])])()[__[_/_]+__[_+~$]+$_[_]+$$](_/_)

・コード2
([,Á,È,ª,É,,Ó]=!{}+{},[[Ç,µ]=!!Á+Á][ª+Ó+µ+Ç])()[Á+È+É+µ+Ç](-~Á)

上記の2つともはalert(1)と相当する合法的なjavascriptです。※但しブラウザ依存があります。

このような記号だけ英数字の使わないコードはどう動いてますか。

コード2のほうは短いから、実装のほうもコード1より巧妙だと思いますので、例として簡単に説明させて頂きます。

まず、読めない記号を読みやすいものに置換しましょう。
Á→AÈ→Bª→CÉ→DÓ→EÇ→Fµ→G

コード2は次のようになります。
([,A,B,C,D,,E]=!{}+{},[[F,G]=!!A+A][C+E+G+F])()[A+B+D+G+F](-~A)

次は、ソースをフォーマットして、もっと読みやすくなってみます。

(
[,A,B,C,D,,E]=!{}+{}, //1
[[F,G]=!!A+A][C+E+G+F] //2
)() //3
[A+B+D+G+F](-~A) //4

これから行ごとに説明しましょう。
1.
"!{}+{}"の結果を変数A,B,C,D,Eに一括代入 ※firefox特有な代入方式

空オブジェクト{}がNULLではないので、!{}がfalseになります。!{}+{}を計算するときに、falseとオブジェクトが数字ではないので、それぞれ文字列にキャストされ、加算ではなく文字列の連結が行われます。

false→文字列"false"

{}→object.toString() = "[object Object]"

よって、

[,A,B,C,D,,E]=!{}+{} = "false[object Object]";
A="a"
B="l"
C="s"
D="e"
E="o"

2.
まず、"!!A+A"の結果を変数F,Gに一括代入します。
[F,G] = !!A+A = !!"a" + "a" =!false + "a" = true + "a" = "truea"

よって、
F="t"G="r"

次、今まで作成した変数C、E、G、Fを使って、値の代入を行います。
[C+E+G+F] = "s" + "o" + "r" + "t" = "sort"

よって、
[[F,G]=!!A+A][C+E+G+F] = [["t","r"]]["sort"] = Array.prototype.sort

3.
カンマ演算子の使い方は左から右へ実行して、一番右の値を返すのです。

よって、コメント1とコメント2の結果はコメント2の値となります。
(Array.prototype.sort)() = window

※window取得の説明はこのリンクをご参照ください。

注意すべきなのは、Array.prototype.sort()でwindowが取れるかどうかはブラウザの実装に依存するので、ブラウザのアドレスバーに下記のコードを入力して確かめてください。
javascript:v=[].sort;alert(v());

"[object Window]"のようなalertが出てきたら、今のブラウザはこの方法でwindowの参照が取れることが分かります。
4.
これから、簡単ですよ。

変数Aが数値に変換できないので、0として処理されることになります。
-~A = -~"a" = -~0 = 1[A+B+D+G+F](-~A) = ["a"+"l"+"e"+"r"+"t"](1) = ["alert"](1)

最後
([,Á,È,ª,É,,Ó]=!{}+{},[[Ç,µ]=!!Á+Á][ª+Ó+µ+Ç])()[Á+È+É+µ+Ç](-~Á) = window["alert"](1) = window.alert(1);

ちょっと面白いでしょう。^o^

追記
最初にこの素晴らしいアイデアを出したのは、日本の技術者@hasegawayosukeでしたと思います。公式サイトはこちらです。http://utf-8.jp/
次の記事
« Prev Post
前の記事
Next Post »
Related Posts Plugin for WordPress, Blogger...