36
JavaScriptによる記号プログラミング @sters9 とあるイベントの思い出

JavaScriptによる記号プログラミング

Embed Size (px)

Citation preview

JavaScriptによる記号プログラミング

@sters9

とあるイベントの思い出

Who are you?

》ごみばこ @sters9

》いけいけうぇっぶえんじにゃあ(=^-ω-^=) ×PHPでケーキを焼いたり

×最近イイ感じです♡

Who are you?

》「ごみばこいん」で検索!

名前のってなかったけど…?

名前のってなかったけど…?

JavaScriptによる記号プログラミング

とあるイベントの思い出

とあるイベントにて

とあるイベントにて

条件表示

HTMLソース

HTMLレンダリング

とあるイベントにて

XSSで alert を実行するだけ!

ただし入力した

/[A-Za-z0-9]+/

が規制される

Input要素がひとつある

とあるイベントにて

(;˘ω˘)

記号で書けばいいのでは…?

記号プログラミング

記号プログラミング

記号プログラミング

"abc"[0]

ES5からしか使えない!

記号プログラミング

"abc"[0]

ES5からしか使えない!

charAtで参照しよう(闇)

せっかくなので解説。

記号でプログラムを書く ↓

せっかくなので解説。

記号でプログラムを書く ↓

文字列からJSを実行する ↓

せっかくなので解説。

記号でプログラムを書く ↓

文字列からJSを実行する ↓

Eval相当が必要 ↓

せっかくなので解説。

記号でプログラムを書く ↓

文字列からJSを実行する ↓

Eval相当が必要 ↓

Function("alert()")() を実行する ↓

せっかくなので解説。

Function("alert()")() を実行する ↓

せっかくなので解説。

Function("alert()")() を実行する ↓

"alert()" を創る必要がある ↓

せっかくなので解説。

Function("alert()")() を実行する ↓

"alert()" を創る必要がある ↓

文字を創るために 数字を創る必要がある ↓

せっかくなので解説。

Function("alert()")() を実行する ↓

"alert()" を創る必要がある ↓

文字を創るために 数字を創る必要がある ↓

(闇)

記号プログラミング

1をつくる

-(~[]) // 1をつくる [] 配列生成 ~ not演算子 => 1の補数ってやつ。 ビット反転。 ~[] ~0 と同義 = -1 ~"" などでも同様 つまり -(~[]) は 1

2をつくる

-(~[]) << -(~[]) // 2をつくる 1 << 1 1 を 1 ビット左シフト つまり (0001) が (0010) となり 2

4、8、16、128をつくる

シフト演算で生産

"[object Object]"

({})+'' {} 空Objectを生成 + '' toStringメソッドの 暗黙的呼び出しが発生する Object型のtoString 未定義であれば "[object Object]"

"true" をつくる

(!![])+'' ![] !true と同義 !![] !!true と同義、 !!true は true true + "" toString変換 ➡ "true"

"false" をつくる

true をひっくり返すだけ。

"undefined" をつくる

[]['']+'' 未定義オブジェクトを参照しにいく → undefined undefined + '' → toString変換により "undefined"

"constructor" をつくる

生成した数値と文字列を利用して、charAtメソッドから取り出す

Function をつくる

[].constructor.constructor

Function をつくる

[].constructor.constructor Array.constructor => function Array(){} (function Array(){}).constructor => Function Function(){}

alertをつくる

生成した数値と文字列を利用して、charAtメソッドから取り出す

発火

ありがとうございました