01. SSTI 취약점을 이해하기 위한 사전 단계


SSTI(Server Side Template Injection)취약점은 웹 어플리케이션에 적용되어 있는 웹 템플릿 엔진(Web Template Engine)에 공격자의 공격 코드가 템플릿에 포함된 상태에서 서버 측에서 템플릿 인젝션이 발현되는 공격을 의미한다. SSTI 취약점을 이해하기 위해서는 취약점이 발현되는 템플릿의 용도와 활용방법에 대한 이해가 필요하기 때문에 본격적으로 SSTI취약점을 소개하기에 앞서 템플릿 엔진의 등장배경과 사용방법에 대해서 간략하게 소개하고자 한다.

1990년경 팀 버너스-리(Tim Berners-Lee)에 의해 세계 최초의 브라우저인 월드와이드웹(WWW)이 세상에 공개되었을 때는 현재의 웹 브라우저처럼 사용자의 동작에 반응하는 기능들이 현저히 낮았다. 단지 정적인 기능만 수행할 수 있는 HTML, CSS로 구동 되었으며, 이후 인터넷의 대중화로 사용자와 상호작용 및 접근성과 유연성을 갖춘 동적 페이지 형태의 웹 브라우저로 발전하였다. 웹 브라우저의 발전의 기반에는 자바스크립트 등 프레임워크 및 라이브러리 등의 브라우징 기술과 템플릿 엔진의 기술이 존재한다.

템플릿 양식과 특정 데이터 모델에 따른 입력자료를 합성하여 결과 문서를 출력하는 소프트웨어 및 컴포넌트를 템플릿 엔진이라고 하는데 웹 템플릿 엔진은 브라우저에서 출력되는 웹 문서를 위한 템플릿 엔진을 의미하게 된다. 정리하자면 고정적으로 사용되는 웹 문서를 템플릿으로 미리 작성해 두고 동적으로 변경되는 데이터 영역만 필요 시에 결합해서 웹 문서를 구성하고 화면에 출력하게 되는 것이다. 보다 자세하게 웹 템플릿 엔진이 무엇인지 간단한 사례를 통해서 사용 목적과 구조에 대해서 다시 한 번 살펴보고자 한다. 또한, 앞으로 본 문서에서 특별히 설명이 필요한 경우가 아니라면 웹 템플릿 엔진을 템플릿으로 지칭해서 사용하도록 하겠다.

[그림 1] Web Template Engine 구조

[그림 1] Web Template Engine 구조

02. Web Template Engine 구조와 적용방안


[그림 2] HTML의 4가지 구조

[그림 2] HTML의 4가지 구조

먼저 Template을 설명하기 전에 잠시 HTML 구조를 살펴보겠다. HTML 문서의 구조는 △ 문서의 시작과 끝을 알려주는 <html> 태그, △ 문서의 형태, 타이틀 정보, 스타일 정보 등이 들어가 있는 <head> 태그, △ 인터페이스 요소를 구성해 브라우저로 출력되며, 정보 전달을 위한 데이터를 표현해주는 <body> 태그, 마지막으로 △ 서버와의 비동기 통신 등 동적인 기능을 제공하기 위한 <script> 태그의 4가지로 구성되어 있다.

웹 문서를 작성하기 위해서는 크게 [그림 2]와 같이 4가지의 큰 틀 안에서 필요한 코드를 작성하게 된다. 또한, 단순히 소개 글 하나만 보여주려는 사이트가 아니라면 목적에 따라 위와 같은 웹 문서 여러 개를 작성하게 되는데 웹 문서마다 반복적으로 사용되는 코드들이 존재한다. 예를 들어, <head> 태그에 들어가는 , <meta>, <title> 태그와 외부 script 파일을 불러오는 <script src=> 태그가 일반적으로 반복해서 사용되는 코드들이다.