Wargame - 웹
mongoboard
김가윤
2023. 4. 26. 17:38
풀이
"/" 페이지에서
게시글 no 값을 보면
96be2960f6cf6 값이 중복된다.
그리고 FLAG 게시글은
no 값이 없다.
index.js 파일 소스를 보니
data.secret라는 값이 존재하면 null
아니면 _id 값을 no 값으로 설정한다.
module.exports = function(app, MongoBoard){
app.get('/api/board', function(req,res){
MongoBoard.find(function(err, board){
if(err) return res.status(500).send({error: 'database failure'});
res.json(board.map(data => {
return {
_id: data.secret?null:data._id,
title: data.title,
author: data.author,
secret: data.secret,
publish_date: data.publish_date
}
}));
})
});
/api/board 페이지에 접근하면
저장된 모든 게시물에 대한 정보를 확인할 수 있다.
no 값을 이용해 /api/board/ 페이지에서
특정 게시물 정보를 읽을 수 있다.
app.get('/api/board/:board_id', function(req, res){
MongoBoard.findOne({_id: req.params.board_id}, function(err, board){
if(err) return res.status(500).json({error: err});
if(!board) return res.status(404).json({error: 'board not found'});
res.json(board);
})
});
secret이 true로 설정되어 있는
FLAG 게시물을 읽기 위해서는
해당 게시물의 _id 값을 알아내야 한다.
MongoDB는 Collections에 데이터를 넣을 때
objectId를 직접 넣어주지 않으면
자동으로 값이 부여되며 저장된다.
이런 objectId의 구조는 12byte 크기의 문자와 숫자로 구성된다.
- 첫 4byte는 timestamp 값을 의미
- 다음 5byte는 랜덤으로 생성된 값이다.
- 다음 3byte는 증가하는 count이며, 최솟값은 랜덤으로 생성된다.
FLAG 게시물은 두 번째 게시물보다
2초 늦게 생성되었기 때문에
첫 4byte는 두 번째 게시물 timestamp에 2를 더하고
다음 5byte는 동일하고
마지막 3byte는 cf6cd1 -> cf6cd2 순으로 증가하는 것을 통해
FLAG 게시물은 cf6cd3 임을 알 수 있다.
파이썬 코드로 간단하게 구할 수 있다.
No_2 = hex(0x6448d500 + 2)
FLAG_NO = No_2[2:]+"96be2960f6cf6cd3"
print(FLAG_NO)