닉네임을 입력하는 폼이 있으며, 닉네임을 입력할 경우 바로 아래 레이아웃에 출력된다.
template injection 문제이며, 힌트로 주어진 portswigger 문서를 참고하여 풀 수 있었다.
간단히 html 같은 정적인 문서를 프로그래밍 언어처럼 동적으로 표현할 수 있게 해준다.
엔진마다 문법이 다르므로, 엔진을 확인해주어야 한다.
for example, the probe {{7*'7'}} would result in 49 in Twig, 7777777 in Jinja2, and neither if no template language is in use.
상세한 구별법은 문서에 안나와있으므로 따로 찾아야 한다.
자주 사용되는 테스트 입력을 전달해본다
{{7*7}} //해석되지 않음
${7*7} //해석됨, 49 출력
${}
형식은 FreeMarker
라는 엔진에서 사용되는 문법인 것 같다.
문서의 해당 내용이 위치한 페이지를 보면 테스트해볼 수 있는 cheet가 나와있다.
<#assign ex="freemarker.template.utility.Execute"?new()> ${ ex("id") }
간략하게 해석해보면 #assign
은 변수를 할당하는 것이고 Execute
클래스 인스턴스를 생성하는 것이다.
FreeMarker contains a TemplateModel class that can be used to create arbitrary Java objects. Other "dangerous" TemplateModel-s can exist in you class-path. Plus, even if a class doesn't implement TemplateModel, its static initialization will be run.
해당 명령어를 입력했을 때 정상적으로 실행되었고, flag 파읽을 읽어주는 명령을 실행하여 플래그를 얻을 수 있었다.