이번엔 BISC board 문제를 풀어볼 거다.
웹페이지 정찰
먼저 접속을 하면 아래와 같이 로그인을 하라고 alert이 뜬다.

그러면 아래와 같이 /login 페이지가 나오는데 계정이 없으니 ID: 1111 PW: 1111로 회원가입 후 로그인 해보겠다.

로그인하면 아래와 같이 글 목록 페이지가 나온다.

Write 버튼을 눌러서 글쓰기도 가능하다.
XSS가 될까 싶어서 아래처럼 글을 써봤는데 XSS는 안 통하는 것 같다.

글을 수정할 때도 XSS는 없는 것 같아 코드를 보고 문제를 풀어보겠다.
코드 확인
먼저 app.js 코드를 봤는데에 계정 정보가 하드코딩 돼있었다.
그 다음 views 디렉터리를 봤는데 아래와 같은 파일 들이 있었다.

이걸로 해당 서버는 pug 템플릿을 쓰는 것을 알 수 있었다.
app.js에 /login 라우트 부분을 봤다.

이걸로 일단 bisc2023 계정은 admin 계정이란 것을 알 수 있었고 로그인 시 id를 소문자로 변환 후 bisc2023와 비교 후 일치하면 'u r not admin'이라는 alert이 뜨면서 다시 로그인 페이지가 뜨는 것을 확인할 수 있었다.
그리고 app.js의 /edit 라우트가 있는데 내용은 아래와 같다.

여길 보면 게시글을 수정할 때 id가 BISC2023일 경우 pretty 설정이 가능한 것을 확인할 수 있다.
취약점 확인
Google에 html pug vuln을 검색하면 CVE-2021-21353이 검색된다.

해당 취약점 내용은 아래와 같다.
취약점 내용은 [여기](https://www.piolink.com/kr/service/Security-Analysis.php?bbsCode=security&vType=view&idx=67&page=4)에서 가져왔다.

즉, 템플릿 엔진이 pretty 옵션을 처리하는 과정에 결함이 있어, 템플릿 내에 Mixin 호출 코드가 포함되어 있다면 이를 통해 RCE 공격을 수행할 수 있다. 해당 취약점은 Pug 3.0.0 버전에 존재하며, 패치되지 않은 3.0.1 미만 버전에서 유효하다.
그럼 bisc2023 계정으로 로그인한 후 글 수정 때 pretty 옵션에 임의 코드를 넣어서 rce를 일으킬 수 있다.
Exploit
먼저 BISC2023 계정으로 로그인해야 되는데 문제는 id를 소문자로 바꾼 후 bisc2023 문자열과 비교하여 "u r not admin"이라고 하면서 로그인이 안 되는 것이다.
이건 터키어 우회로 가능하다.
ID: BıSC2023 PW: TeamH4C를 입력하면 BISC2023 계정으로 로그인이 가능하다.

아무 게시글이나 누른 후 edit을 누른다.
이 때 나는 burp suite를 이용해서 request를 잡았다.
아래는 그 화면이다.

여기에 pretty 옵션을 추가해서 github에서 발견한 poc 코드를 넣는다.

그리고 request를 전송하면 된다.
그런데 flag 값이 튀어나오지 않았다.

도저히 이유를 모르겠어서 ai한테 물어봤더니 exec는 비동기 함수라 execSync를 써야되고 flag 값을 화면에 뿌리기 위해 throw를 써야한다는 것이었다. 그래서
');throw process.mainModule.require('child_process').execSync('cat /flag.txt').toString();_=('
이 코드를 다시 pretty에 넣어주고 요청을 보냈다.

그렇게 했더니 깔끔하게 flag 값이 나온 것을 확인할 수 있었다.

flag: BISC2023{C97AA493EB8C29FE438C829C0B99E96714928568}'Dreamhack > Web' 카테고리의 다른 글
| [Dreamhack] phpmyredis (0) | 2025.11.24 |
|---|---|
| [Dreamhack] PATCH-1 (0) | 2025.08.20 |
| [Dreamhack] chocoshop (0) | 2025.08.13 |
| [Dreamhack] Safe Input (0) | 2025.04.17 |