Portswigger-Server-side template injection using documentation
풀이
SSTI 취약점이 있다. 템플릿 엔진을 알아내고 Carlos 홈 디렉토리의 morale.txt 파일을 삭제해야 한다. content-manager:C0nt3ntM4n4g3r 계정으로 로그인할 수 있다.

위 계정으로 로그인을 하면 컨텐츠 페이지에서 기존에는 보이지 않는 버튼이 보인다.


버튼을 누르면 컨텐츠를 수정하는 페이지로 이동한다. Preview 버튼을 누르면 하단에 템플릿이 적용된 버전의 컨텐츠가 출력된다.

템플릿에 존재하지 않는 변수를 참조하면 에러메시지가 출력된다. 에러메시지를 통해 이 서버가 Java 서버이며(아마도 Spring), FreeMaker 템플릿 엔진을 사용한다는 것을 알 수 있다.

SSTI 기본적인 페이로드인 <#assign ex = "freemarker.template.utility.Execute"?new()>${ ex("id")} 를 입력하였다. 이 페이로드를 실행하여 ID가 출력된 것을 볼 수 있다. 임의 셸 커맨드를 실행할 수 있음을 증명했다.

문제의 목적인 Carlos 홈 디렉토리의 morale.txt 파일을 삭제하기 위해 현재 디렉토리를 조회한다. pwd 실행 결과 현재 /home/carlos 디렉토리에 있음을 알 수 있다.

문제의 목표인 morale.txt 파일을 삭제하기 위한 페이로드를 생성해 보낸다. <#assign ex = "freemarker.template.utility.Execute"?new()>${ ex("rm ./morale.txt")} 페이로드를 보내면 성공한다.
이 취약점은 사용자가 입력한 값을 검증하지 않아서, SSTI 페이로드를 sanitize 하거나 인코딩하지 않고 처리했기에 발생했다.
tags: writeup, ssti, wstg-inpv-18, freemaker, web hacking