워게임/Root Me

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

SecurityMan 2022. 5. 24. 11:00

 

비교적 최근에 출제된 웹해킹(SSTI) 문제이다.

 

SSTI란 Server Side Template Injection의 약자로

 

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

 

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

 

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

 

반응형

 

 

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

 

사용자에게 title과 page content를 입력을 받고 있다.

 

 

시험삼아 test title / test content 라고 각각 입력을 한 뒤,

 

Render your page! 버튼을 눌러줬다.

 

 

그러면 이렇게 내가 입력한 값이 까만 화면에 하얀 글씨로 출력이 된다.

 

이게 이 웹페이지 기능의 전부이다.

 

 

SSTI 공격을 할때는 먼저 서버측에서 사용하는 템플릿 엔진의 종류를 알아야 한다.

 

위 사진이 SSTI 할때 바이블 처럼 사용되는 사진인데

 

여기서 {{7*7}} 를 먼저 사용해보자.

 

입력창에 {{7*7}} 이라고 입력했을때, {{7*7}} 이 그대로 출력되면 취약점이 없는것이고,

 

7*7이 계산되어서 49로 출력되면 SSTI 취약점이 존재한다고 생각하면 된다.

 

 

다시 돌아와서 title 과 page content에 {{7*7}} 이라고 입력해본다.

 

 

결과를 확인해보면, title은 {{7*7}} 이라고 입력한 값이 그대로 출력되었으나,

 

page content 같은 경우 7*7이 계산되어서 49가 출력된 모습이 보인다.

 

SSTI 공격이 가능한 벡터는 page content 입력창이다.

 

이제 차근차근 페이로드를 완성시켜가면 된다.

 

페이로드를 짤때는 보통 github를 많이 참고하는 편이다.

(https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2)

 

SSTI로 원격 명령어를 실행하기 위해선 Popen 클래스를 찾아야 한다.

 

{{config.__class__.__base__.__subclasses__()}}

 

Popen 클래스를 찾기 위해서 위와 같이 먼저 입력해준다.

 

 

저렇게 입력하면 엄청나게 많은 값들이 나오는데

 

그 중간에 <class 'subprocess.Popen'> 이 들어있다.

 

이제 이 Popen이 몇 번째에 있는지 알아야 한다.

 

 

가독성 있게 편집하기 위해 웹 페이지 내용을 전부 복사해서

 

Notepad++에 붙혀넣기 해줬다.

 

 

그리고 나서 반점(,)을 모두 \r\n(엔터) 로 모두 바꾸기를 해줬다.

 

 

그럼 이렇게 보기 쉽게 엔터가 쳐지고, 앞에 줄 수로 넘버링도 가능하다.

 

 

Popen 을 찾아보면, 409번째 줄에 있는걸 볼 수 있다.

 

409번째 줄이지만 python 배열은 0부터 인덱스가 시작하므로, 408번째에 있다고 생각하면 된다.

 

{{config.__class__.__base__.__subclasses__()[408]('ls -al',shell=True,stdout=-1).communicate()[0]}}

 

이제 찾아낸 Popen을 이용해서 명령어를 날려보면 된다.

 

[408] 로 Popen을 선택해주고, ls -al 명령어를 날려봤다.

 

ls -al 은 현재 디렉토리에 있는 모든 파일/폴더 목록을 자세하게 보여주는 명령어이다.

 

 

이런 값이 나오는데

 

아까 했던것 처럼 Notepad++을 이용해 깔끔하게 만들어주면

 

 

이렇게 나온다.

 

.passwd 파일이 있는게 보인다.

 

이름부터가 아주 매력적인 파일이다.

 

아마도 여기에 플래그가 숨어있을 것이다.

 

 

아까 ls -al 부분을

 

cat .passwd 로 바꿔서 .passwd 파일의 내용을 읽어 출력시켜 본다.

 

 

그럼 플래그를 찾을 수 있다.

반응형