워게임/HackTheBox

[HackTheBox] Templated - 웹해킹 / SSTI

SecurityMan 2022. 10. 2. 11:00

 

SSTI 와 관련된 웹해킹 문제

 

SSTI란 Server Side Template Injection의 약자로

 

템플릿 엔진으로 웹 어플리케이션을 구동하는 경우, 공격자가 템플릿 구문을 악용하여

 

삽입할 수 있는 취약점이다.

 

이렇게 템플릿 구문이 삽입되게 되면, 원격 명령어 실행도 가능하게 되는 위험한 취약점이다.

 

반응형

 

 

문제 페이지에 접속하면 이런 화면이 나온다.

 

아직 완성되지 않은 웹 서버를 묘사해놓은것 같은데

 

Site still under construction 이라고 되어있고

 

아래쪽에 Proudly powered by Flask/Jinja2 라고 적혀있다.

 

이 부분이 아주 큰 힌트이다.

 

 

일단 공격 벡터를 찾기 위해 이것저것 시도해봤다.

 

URL에 없는 경로를 입력할 경우

 

404 Error 페이지로 이동하게 되는데,

 

404 페이지에서 나오는 안내문구에 URL에서 입력한 경로가 그대로 찍혀서 나오는 것을 볼 수 있다.

 

이 부분이 공격 벡터라고 의심했다.

 

 

이 부분이 벡터가 맞는지 확인하는 방법은 아주 쉽다.

 

사전에 웹서버가 Jinja2 를 사용한다는것을 알고있었기 때문에,

 

이 그림에서 Jinja2 에 해당하는 {{7*7}} 을 입력해보면 된다.

 

 

URL에 /{{7*7}} 이라고 입력하면

 

URL 인코딩이 되어서 %7B%7B7*7%7D%7D 라고 보이게 된다.

 

아래쪽 안내메세지에는 당연히 {{7*7}} 이 출력되어야 하지만,

 

7*7 계산이 되어서 49가 출력되는것을 볼 수 있다.

 

이렇게 되면 SSTI 취약점이 존재하는 것이다.

 

 

이 문제는 아무런 필터링을 하고 있지 않기 때문에 아주 쉽다.

 

일단 SSTI 문제는 보통 SSTI 취약점을 통해 서버의 운영체제 명령어를 실행시키는것을 목표로 한다.

 

운영체제 명령어를 사용하기 위해 os 라이브러리를 불러와야 하는데,

 

/{{config.__class__.__init__.__globals__['os']}}

 

라고 입력하면 os 라이브러리가 있는것을 확인할 수 있다.

 

 

/{{config.__class__.__init__.__globals__['os'].popen('ls').read()}} 라고 입력하면

 

웹을 통해 ls 명령어를 실행시킬 수 있다.

 

실행결과를 보면 현재경로에 flag.txt 파일이 있는것을 확인할 수 있다.

 

 

읽어야할 파일이 무엇인지 알았으니

 

/{{config.__class__.__init__.__globals__['os'].popen('cat flag.txt').read()}}

 

라고 입력하면 flag.txt 파일을 읽을 수 있고, 플래그를 획득할 수 있게된다.

반응형