JavaScript
TODO
Loose Comparison
==
や <
のような演算子は"あいまいな比較"、つまり暗黙の型変換を含む比較を行う。
TSG CTF 2023 - Upside-down cake
JSF**k
[]()!+
の6文字のみで任意のJavaScriptを実行するというもの
JSF**kで起こすXSSペイロードをコードゴルフする問題
この問題にはコード長の制限があり、CTFの開始時からだんだんコード長の制限が増えていき、誰かが問題を解いた時点でコード長はロックされそれ以上は増えなくなるという形式(LockDown)を取っているのが面白い。
String.prototype.replace
第2引数が操作できるとき、単純な置換にならない特殊な動作を起こせる
Regexp
直前に評価した入力など、Regexpオブジェクトには様々な状態が格納されている
Proxy
色々フックできて便利
sandbox escapeにも使えることがある
arguments, callee, caller
escape問などで
たいていstrict modeなので使えない方が多い
this.constructor.constructor("return process").mainModule.require("child_process").execSync("ls -al")
有名なSandbox Escapeの手法
どんな方法でもいいのでFunctionオブジェクトにアクセスできれば文字列から任意の関数を作れる
process.mainModule.requireの代わりにprocess.bindingも使える
スプレッド構文
{...obj}
や [..obj]
でobjを辞書や配列として展開できる
{isAdmin: false, ...obj}
のようなときに、objが {isAdmin: true}
なら前方の isAdmin
を上書きできる
行終端子
行の終端として認識される文字は \r
、 \n
の他に \u2028
と \u2029
がある
// {user_input}
のように文字列を入れられるが \r
や \n
が使えないとき、 \u2028
などを使うことでコメントを終わらせて次の行を書ける
javascript:
URLで改行が禁止されているときに \u2028
を入れると改行できることもある。FireFoxでできたが、現在も有効か要調査
TODO: リンク貼る
Bracket Notation (ブラケット記法)
a[b]
みたいなやつ
JavaScriptのプロパティアクセスはドットでも添字でもアクセスできる
a["b"]["c"]
と a.b.c
は等価
obj["constructor"]
でObject.prototype.construtorを参照できる
SECCON CTF 2023 Quals - Bad JWT