SSTI 실습(3) - Freemarker Template Injection으로 파일 삭제 (PortSwigger Academy)
Freemarker 템플릿 엔진을 식별하고 문서를 활용해 Execute 클래스로 OS 명령 실행하는 과정
Lab: Server-side template injection using documentation
Lab Link: Server-side template injection using documentation
개요
이 lab은 SSTI 취약점을 찾는 것보다,
문서를 기반으로 공격을 확장하는 과정이 핵심이다.
템플릿 엔진을 먼저 확인하고,
문서에 나온 기능을 이용해서 코드 실행까지 이어간다.
목표는 동일하게 morale.txt 파일 삭제다.
문제 접근
주어진 content-manager 계정으로 로그인하면
상품 description을 직접 수정할 수 있다.
템플릿을 보면 ${product.name}, ${product.price} 같은 문법이 사용되고 있다.
이 형태로 값을 출력하는 구조다.
템플릿 엔진 식별
엔진을 알아내기 위해 일부러 에러를 발생시켜본다.
계속 테스트 해오던
1
2
3
4
5
{{7*7}}
${7*7}
<%= 7*7 %>
${{7*7}}
#{7*7}
를 이용해서 테스트 해보겠다.
Case 1. {7*7}
서버에서 7*7이 계산되어 49를 반환한다.
Case 2. ${{7*7}}
아무것도 반환하지 않는다.
Case 3. #{7*7}
서버에서 7*7이 계산되어 49를 반환한다.
Case 4. <%= 7*7 %>
문자열 그대로 출력한다.
Case 5. {{7*7}}
문자열 그대로 출력한다.
HackTricks 사이트에서 위 결과와 비슷한 테스트 결과를 가진 템플릿 엔진을 찾아보면, Freemarker와 동일하다는 걸 확인할 수 있다.
문서 확인
Freemarker 문서를 확인 해보다보면,
new()라는 built-in function이 나온다.
임의의 Java 객체를 생성할 수 있는 기능이다.
이걸 더 따라가면
TemplateModel을 구현한 클래스 목록이 나오는데,
그 중 하나가 Execute 클래스다. 이 클래스는 OS 명령을 실행할 수 있다.
Exploit
Freemarker Documentation을 참조해서
payload를 만들어보면 아래와 같다.
1
<#assign ex="freemarker.template.utility.Execute"?new()> ${ ex("명령어") }
위 payload를 editing에 있는 파라미터 값들에 넣어준다. 처음에는 테스트를 위해 whoami로 시작한다.
이후에 이전 lab을 풀었던 방식처럼 ls커맨드와 rm커맨드로 morale.txt파일을 삭제해주면 lab이 해결된다.
정리
이번 lab은 흐름이 명확하다.
1
에러 유도 → 엔진 식별 → 문서 확인 → built-in 활용
SSTI는 새로운 취약점을 찾는 과정이라기보다
이미 존재하는 기능을 어떻게 사용하는지에 가깝다.








