web_security/web info

SSTI란?

HawordFREAKEK 2019. 9. 4. 22:43

네 안녕하세요. Godhaword입니다.

이번에 쓸 글은 SSTI, Server-Side Template Injection 입니다.


목차는

1. Server-Side Template 을 사용하는 이유

2. Server-Side Template 의 취약점

3. Server-Side Template Injection 을 하는 방법

4. 예제 문제 풀이

순으로 쓰겠습니다.




1. Server-Side Template 을 사용하는 이유

일단 설명에 앞서 정적 웹 페이지와 동적 웹 페이지가 무엇인지 알아두셔야 왜 SSTI를 사용하는지 더 쉽게 이해 가능합니다.
정적 웹 페이지는 서버에 저장된 정보들을 그냥 보여주는 페이지고, 동적 웹 페이지는 서버에 있는 정보를 스크립트를 이용하여 한 번 가공하여 유저에게 보여주는 웹페이지입니다.
웹 페이지를 만드는데에는 주로보는 HTML나 css, 자바스크립트, php 같은 것을 주로 사용합니다. 
HTML 을 사용하여 동적 페이지를 만들게되면 관리가 어렵고, 코드가 길어진다는 단점이 있습니다.
하지만 템플릿을 사용하게 된다면 간단한 문법을 사용하여 더 쉽고 짧은 코드로 사용할 수 있고, 하나의 템플릿을 만들어 놓으면 여러 페이지에 적용하여 유지보수하기 더 쉽게 됩니다.




2. Server-Side Template 의 취약점

위와 같은 장점을 갖고 있기 때문에 많은 페이지에서 템플릿을 사용합니다. CTF를 풀다보면 FLASK 에서 주로 SSTI 관련 문제가 나오고, 이외에도 DJANGO, ASP, JSP 같은 페이지에서도 자주 사용됩니다.

하지만 Server-Side Template을 사용하게 되면, 치명적인 단점이 생기는데, 만약 RCE(Remote Code Excute) 가 템플릿의 문제열이나 파일위치에 들어가게 되면 공격자가 원하는 대로 인젝션을 할 수 있게됩니다. whoami를 사용하거나 CTF에선 주로 cat flag.txt 와 같은 형식으로 사용합니다. 이러한 취약점은 eval 함수를 쓴 페이지 요소와 매우 흡사합니다. 

동적데이터를 템플릿으로 저장할 때 템플릿 내에서 처리하지 않고, 템플릿 엔진의 기능을 사용하여 쓰는 것도 이 취약점을 방어하는데 큰 도움이 됩니다.




3. Server-Side Template Injection을 하는 방법

CTF 기준으로 설명하자면, 구문을 입력하는 곳에 {{config}}나 주어진 단서를 활용하여 File.open('/etc/passwd')를 인젝션하여 디렉토리를 확인하거나, 위에 언급한 것과 같이 cat flag.txt 같은 코드를 rce하여 flag 값을 뽑아오는 방법 등이 있습니다. 자료를 찾던 중에 페이지 마다 구문을 정리하여 나열해둔 사이트도 있다 하는데 지금은 그 사이트가 열리지 않아 나중에 찾는 대로 추가하겠습니다.(버프슈트의 플러그 인이나 tqlmap 으로도 어떤 템플릿 엔진을 쓰는지 구분 가능하다 합니다. 페이지마다 그에 맞는 구문을 인젝션해야합니다.)

추가적인 정보나 활용은 CTF에 관련 문제가 나오면 Write up 하는 식으로 해서 추가설명하겠습니다.



4. 예제 문제풀이

root-me라는 사이트에 SSTI를 연습할 좋은 문제가 있었습니다.

일단 문제 이름이 java server side template injection 이기 때문에 ssti 관련 문제겠구나 하고 입력창에 몇 가지 쳐봅니다.

중괄호 안에 간단한 식을 넣으면 계산이 되어 나올 줄 알았는데 그냥 받은 그대로 출력을 하네요.


찡긋

원래 테스트 해보기 위해서 저 안에 아무런 계산식이나 넣어도 되는데... 처음에 공부할때 많은 분이 7*7 을 사용하셔서 저도 사용하게 됬습니다..(국룰인가..?)

위에선 ${xxx} 안에 계산식을 넣으면 실행이 되어 간단한 명령어를 쳐봤는데 작동을 하지 않았습니다.

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

그래서 위 사이트의 문장을 참고해 그 문장 안에 명령어를 넣어봤습니다.

whoami 와 같은 간단한 명령어는 이제 작동하기 시작했고.

크으...

Exploit the vulnerability in order to retrieve the validation password in the file SECRET_FLAG.txt.

문제 취지에 맞게 SECRET_FLAG.txt를 불러오자 flag값이 떴습니다