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 크기의 문자와 숫자로 구성된다.

  1. 첫 4byte는 timestamp 값을 의미
  2. 다음 5byte는 랜덤으로 생성된 값이다.
  3. 다음 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)