본문 바로가기

Dreamhack/웹해킹

[LEVEL 1] simple-ssti

웹 서비스에 접속하면 상단에 ‘SSTI’라는 메뉴바와 함께 초기 화면이 나타납니다.  
이 화면에서는 ‘Welcome !’ 문구와 함께 My Pages 항목으로 404Error, robots.txt 페이지가 제공됩니다.

🔎 SSTI란?

정의: 웹 애플리케이션이 사용자 입력을 서버 측 템플릿 엔진(Jinja2, Twig, Mako 등)에 직접 반영할 때 발생하는 취약점입니다
원인: 템플릿 엔진은 보통 {{ }} 또는 {% %} 같은 문법을 사용해 변수를 처리하는데, 이때 외부 입력이 필터링 없이 들어가면 코드 실행으로 이어질 수 있습니다.
위험성: 단순히 텍스트 변조가 아니라, 서버 측에서 임의 코드 실행(RCE, Remote Code Execution)까지 이어질 수 있어 매우 위험합니다.예: 공격자가 {{7*7}} 같은 입력을 주었을 때, 템플릿 엔진이 이를 해석하여 49를 반환하면 취약성이 확인됩니다.

 

404Error 페이지에 접속해보니, 아래와 같이 단순히 "Page Not Found."라는 문구와 함께 404 에러 화면이 출력되는 것을 확인할 수 있었습니다.

 

SSTI의 경우, 예를 들어 {{7*7}} 과 같은 입력을 주었을 때 서버가 이를 계산하여 49라는 결과를 출력한다면 템플릿 엔진이 사용자 입력을 해석하고 있다는 의미로, 취약점이 존재함을 알 수 있습니다.

실제로 {{7*7}} 을 입력해 결과가 49로 출력되는지 확인해보겠습니다.

 

직접 {{7*7}} 을 입력하여 요청을 보낸 결과, 화면에 49가 출력되는 것을 확인할 수 있었습니다.  
이를 통해 서버가 사용자 입력을 템플릿 엔진에서 해석하고 있음을 알 수 있으며, SSTI 취약점이 존재함을 확인할 수 있습니다.

http://host8.dreamhack.games:12383/{{7*7}}

👉 동작 원리

  • {{7*7}}을 입력했을 때 단순히 문자열 그대로 출력되는 것이 아니라, 결과값인 49가 나타난 이유는 서버가 사용하는 템플릿 엔진의 동작 방식 때문입니다.
  • 템플릿 엔진(Jinja2, Twig 등)은 {{ }} 구문을 변수나 표현식으로 인식하여 서버 측에서 처리합니다. 따라서 {{7*7}}이 들어오면 이를 단순 텍스트로 보여주는 것이 아니라 실제로 7 곱하기 7이라는 연산을 수행하고, 그 결과인 49를 클라이언트에게 반환합니다.
  • 이 과정은 원래 정상적으로는 개발자가 지정한 변수만 처리해야 하지만, 사용자 입력이 필터링 없이 템플릿에 직접 반영되면 공격자가 의도한 코드까지 실행될 수 있습니다. 이처럼 사용자 입력이 서버 측 코드 실행으로 이어지는 현상이 바로 SSTI(Server-Side Template Injection) 취약점입니다.

SSTI 취약점 검증 단계에서 {{7*7}} 과 같은 단순 연산으로 동작을 확인한 뒤, 다음 단계에서는 서버 내부의 민감한 정보에 접근할 수 있는지를 검증해야 합니다.  
이를 위해 {{config}}를 사용했으며, 이는 Flask/Jinja2 환경에서 서버의 환경 설정을 노출할 수 있는 대표적인 속성입니다.  
그 결과 {{config}} 출력에서 서버 내부 설정이 그대로 드러났고, 특히 플래그 값이 함께 노출되는 것을 확인할 수 있었습니다.

'Dreamhack > 웹해킹' 카테고리의 다른 글

[LEVEL 1] mongoboard  (0) 2025.09.06
[LEVEL 1] php-1  (0) 2025.09.06
[LEVEL 1] image-storage  (0) 2025.09.04
[LEVEL 1] xss-1  (0) 2025.09.03
[LEVEL 1] csrf-1  (0) 2025.09.03