ROOTME] Server Side Template Injection

노션으로 옮김·2020년 3월 5일
0

wargame

목록 보기
9/59
post-thumbnail

문제

닉네임을 입력하는 폼이 있으며, 닉네임을 입력할 경우 바로 아래 레이아웃에 출력된다.

풀이

template injection 문제이며, 힌트로 주어진 portswigger 문서를 참고하여 풀 수 있었다.

Template

간단히 html 같은 정적인 문서를 프로그래밍 언어처럼 동적으로 표현할 수 있게 해준다.

Detect

엔진마다 문법이 다르므로, 엔진을 확인해주어야 한다.

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라는 엔진에서 사용되는 문법인 것 같다.

Exploit

문서의 해당 내용이 위치한 페이지를 보면 테스트해볼 수 있는 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 파읽을 읽어주는 명령을 실행하여 플래그를 얻을 수 있었다.

0개의 댓글