JavaScript
TODO
Loose Comparison
==や<のような演算子は"あいまいな比較"、つまり暗黙の型変換を含む比較を行う。
TSG CTF 2023 - Upside-down cake
MDN: https://developer.mozilla.org/ja/docs/Web/JavaScript/Equality_comparisons_and_sameness
JSF**k
[]()!+の6文字のみで任意のJavaScriptを実行するというもの
ここから試すことができる: http://www.jsfuck.com/
解説: https://kokudori.hatenablog.com/entry/2013/09/19/082547
RedpwnCTF 2021 - wtjs https://github.com/redpwn/redpwnctf-2021-challenges/tree/master/web/wtjs
JSF**kで起こすXSSペイロードをコードゴルフする問題
この問題にはコード長の制限があり、CTFの開始時からだんだんコード長の制限が増えていき、誰かが問題を解いた時点でコード長はロックされそれ以上は増えなくなるという形式(LockDown)を取っているのが面白い。
String.prototype.replace
第2引数が操作できるとき、単純な置換にならない特殊な動作を起こせる
MDN: https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replace#引数としての文字列の指定
https://blog.huli.tw/2022/04/14/javascript-string-regexp-magic/
Regexp
直前に評価した入力など、Regexpオブジェクトには様々な状態が格納されている
DiceCTF 2022 - no-cookies https://blog.huli.tw/2022/02/08/what-i-learned-from-dicectf-2022/
Proxy
色々フックできて便利
sandbox escapeにも使えることがある
DiceCTF 2023 - jwtjail https://brycec.me/posts/dicectf_2023_challenges#jwtjail
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も使える
スプレッド構文
MDN: https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax
{...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
Prototype Pollution