mongoboard


소스코드 분석

  • “package.json” 파일을 통해 app.js 파일이 시작점임을 확인했다.
...
"scripts": {
    "start": "node app.js"
  },
  ...

app.js

  • app.js 파일은 다음과 같은 구조로 동작한다.
    • (1) 13라인 : MongoDB 접속
    • (2) 16라인 : ./models/board.js 파일을 require 모듈로 불러와 “Board” 변수에 할당
    • (3) 19-21라인 : 애플리케이션 초기 설정
    • (4) 23-28라인 : 접근 제어 관련 응답 헤더 설정
    • (5) 31-34 라인 : 라우팅 설정 (’/’ 경로 접근 시 ‘/index.html’ 리소스 반환)
    • (6) 37-40 라인 : 서버가 실행/운영되는 포트 설정

index.js

  • 플래그는 index.js 파일을 분석해야 획득이 가능했다. 하나씩 분석해보겠다.

게시글 조회

  • /api/board 경로로 GET 요청을 보내면 아래 코드가 실행되며 반환된 데이터를 화면에 출력한다.
    • _id : 게시글 번호
    • title : 게시글 제목
    • author : 게시글 작성자
    • secret : 비밀글 여부
    • publish_date : 게시글 작성일

게시글 본문 조회

  • /api/board/{board_id} 경로로 GET 요청을 보내면, 게시글 상세 내용이 조회된다.

게시글 작성

  • (PUT Method) /api/board 경로로 요청을 보내면 게시글이 작성된다.

  • ”/” 경로로 접근하면, /static/?.js 파일이 서버로부터 반환된다.
  • 아래 js 파일은 / 경로로 접근 시에 자동으로 /api/board API를 호출하고 있다.

  • (GET Method) /api/board 호출 결과는 아래와 같다.
    • 게시글 번호가 임의의 24개 문자로 구성되어 있었다.
  • 비밀글에는 게시글 번호(no)가 반환되지 않았으나, 실제로 MongoDB의 boards 컬렉션에는 저장되어 있을 것이다. 따라서, 비밀글의 게시글 번호를 유추하여 직접 접근하면 접속이 가능해 보인다.

  • 게시글 번호는 아래와 같은 형식을 띠고 있었다.
  • 3개의 게시글 번호가 모두 매우 유사한 형태로 구성되어 있다.
    • 따라서, 7번째/8번째/마지막 문자를 페이로드로 하여 브루트 포스 공격을 진행해보겠다.
6909f5 2 9 1bb555f015b74a3 a
6909f5 2 e 1bb555f015b74a3 b
6909f5 3 4 1bb555f015b74a3 d

  • 비밀글의 게시글 번호로 직접 접근하여 플래그 획득에 성공했다.

🐛.. 🐛.. 🐛..