워게임/Root Me

[Root Me] Java - Server-side Template Injection - 웹해킹 / SSTI

SecurityMan 2022. 8. 18. 11:00

 

30점짜리 웹해킹 문제

 

문제 제목에 나와있는

 

Server Side Template Injection 문제이다.

 

오래전에 블로그에서 SSTI 관련된 문제를 다룬적이 있었다.

(https://hackingstudypad.tistory.com/150)

 

그때도 역시나 Root Me에서 제공하는 문제였는데,

 

다른점이 있다면 그때는 Python 기반의 웹이었고, 이번엔 Java 기반의 웹이라는 것이다.

 

반응형

 

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

 

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

 

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

 

이번 문제의 목표는

 

SSTI 취약점을 이용해 서버 운영체제 명령어를 실행하여

 

서버 내에 숨겨진 SECRET_FLAG.txt 파일의 내용을 읽는 것이다.

 

 

문제 페이지에 접속하면 

 

닉네임을 입력하라는 문구가 나온다.

 

 

예를들어 hello 라고 입력하면

 

밑에 그대로 내가 쓴 닉네임을 echo 해주는 단순한 기능을 가진 웹페이지이다.

 

 

SSTI 할때 가장 참고하면 좋은 그림이다.

 

SSTI 취약점이 있을것 같은 곳에 여기있는 페이로드들을 하나씩 차례대로 입력해보면 된다.

 

 

맨 앞에있는 ${7*7} 을 입력해본다.

 

내가 쓴 닉네임을 그대로 echo 하는 것이기 때문에

 

당연히 아래쪽에는 It's seems that I know you :) ${7*7}  이라고 나와야하지만

 

7*7 이 계산이 되어서 49가 출력되고 있다.

 

이건 서버에서 7*7을 명령어로 인식해서 계산을 해버렸기 때문이다.

 

계산이 되었다면 SSTI 취약점이 존재하는 것이다.

 

만약 Python 이었다면 여기서 Popen 클래스를 찾아서 명령어를 실행시키면 된다.

 

하지만 이건 Java 이므로 조금 다르게 접근해야 한다.

 

 

문제페이지에서 f12를 눌러 개발자 도구를 열어준 뒤

 

네트워크 탭에서 응답 헤더를 살펴보면

 

X-Powered-By : FREEMARKER 라고 적힌 헤더를 찾을 수 있다.

 

 

구글에 FREEMARKER를 검색해보면, 위키 백과에 아주 잘 설명이 되어있다.

 

자바 기반의 템플릿 엔진이라고 한다.

 

빨간 네모친 부분을 살펴보면 템플릿을 넣을때 ${...} 와 같은 형식으로 넣는것을 볼 수 있다.

 

아까 사용했던 ${7*7} 과 같은 형태이다.

 

Freemarker SSTI 라고 구글링을 열심히 해본 결과 한가지 문서를 찾았다.

 

https://www.blackhat.com/docs/us-15/materials/us-15-Kettle-Server-Side-Template-Injection-RCE-For-The-Modern-Web-App-wp.pdf

 

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

 

문서를 읽어보면 위처럼 입력할 경우 SSTI 취약점을 이용해 ex( ) 안에 있는 명령어가 실행된다고 한다.

 

 

그대로 한번 입력해봤더니

 

id 명령어가 잘 실행되어서 출력되는것이 보인다.

 

이제 문제의 목표인 SECRET_FLAG.txt 를 찾아주면 된다.

 

 

ls 명령어를 입력하면

 

현재 디렉토리에 바로 SECRET_FLAG.txt 가 있는것이 보인다.

 

 

cat SECRET_FLAG.txt 명령어를 입력하면

 

그 안에 숨겨져 있는 플래그를 찾을 수 있다.

반응형