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