01. SSTI와 Thymeleaf 개요


1) SSTI 취약점과 Thymeleaf 개요

타깃 시스템의 애플리케이션에 악성 템플릿 코드를 주입하여 서버에서 템플릿 엔진이 실행되면서 공격자가 삽입한 임의의 공격 코드가 실행되는 공격을 SSTI(Server Side Template Injection)라 한다. SSTI는 다른 SQL Injection, Command Injection, LDAP Injection 등과 같이 OWASP(Open Web Application Security Project) Top 10 2021의 ‘A03 : Injection’에 포함되는 Injection 공격의 일종이다.

SSTI가 악용하는 서버 사이드 템플릿 엔진은 웹 개발에서 UI 렌더링을 위해 반드시 필요한 기술로 서버에서 동적 콘텐츠를 생성하기 위해 모델 데이터를 템플릿과 결합하여 HTML 등의 결과물을 출력하는 역할을 한다. 이글루코퍼레이션 2022년 9월 호에서 『웹 템플릿 엔진 기반의 SSTI 취약점 분석 』을 통해 SSTI 취약점을 분석한 바 있어서 이번 문서에서는 서버 사이드 템플릿 엔진 중 스프링 부트(Spring Boot)를 비롯한 프레임워크에서 JAVA 기반의 뷰 템플릿 엔진(View Template Engine)인 타임리프(Thymeleaf) 환경에서 발생하는 SSTI에 대해서 보다 자세히 살펴보고자 한다.

Thymeleaf는 Spring 공식 문서에서도 주요 템플릿 엔진으로 권장될 정도로 JAVA 기반 웹 애플리케이션 개발에 널리 사용되는 서버 사이드 템플릿 엔진이다. Spring MVC와 자연스럽게 통합되어 컨트롤러에서 전달된 모델 데이터를 템플릿에서 사용하기 쉽다는 장점뿐만 아니라, Spring Boot에서 별도의 설정 없이 바로 사용할 수 있는 기본 템플릿 엔진이기 때문에 Spring Boot에서 많이 사용되고 있다.

Thymeleaf의 가장 큰 특징은 일반 HTML 안에 동적 데이터를 삽입할 수 있는 태그와 속성을 제공한다는 점이다. 이를 통해 개발자는 서버 사이드에서 생성된 데이터를 HTML 문서에 효과적으로 통합할 수 있으며, 이 과정에서 SpringEL과 같은 표현 언어를 사용하여 데이터를 동적으로 처리할 수 있다. 웹 페이지 개발 시에 웹 페이지 상단이나 하단, 카테고리 영역 등 중복되는 영역을 반복해서 사용하는 것은 유지보수나 가독성 측면에서 비효율적이지만, Thymeleaf에서는 템플릿 프래그먼트(fragment)를 제공하기 때문에 코드 중복을 최소화 할 수 있다.

따라서 본 문서에서는 Thymeleaf의 특징인 코드 재사용성과 동적 콘텐츠 생성의 편의성을 악용하여 SSTI를 발현시킬 수 있는 방법에 대해 살펴보고 이에 따른 대응 방안을 모색해 보고자 한다.

2) Thymeleaf 특성 및 기본 문법

Spring 환경에서의 Thymeleaf 템플릿 엔진의 특성을 요약하자면 아래와 같다.

<aside> 💡 1. Thymeleaf의 템플릿 fragment 기능을 활용한 코드 재사용성

2. Thymeleaf의 템플릿 동적 콘텐츠 생성의 용이성

</aside>

Thymeleaf의 특성은 웹 어플리케이션 개발에 있어서는 유용할 수 있으나 반대로 SSTI 공격에 악용할 수 있는 영역을 제공하게 된다. 본격적으로 Thymeleaf 템플릿 엔진을 이용한 SSTI 공격을 살펴보기에 앞서 SSTI에서 악용하는 Thymeleaf의 기본 표현방식과 태그 속성에 대해서 [표 1]을 통해 간략하게 알아보고자 한다.