SSTI 실습(2) - Tornado Template Injection (Code Context)로 파일 삭제 (PortSwigger Academy)
Tornado 템플릿의 code context에서 SSTI를 이용해 Python 코드 실행 및 파일 삭제 과정 정리
Lab: Basic server-side template injection (code context)
Lab Link: Basic server-side template injection (code context)
개요
이 lab은 Tornado 템플릿을 사용하는 과정에서
사용자 입력이 안전하게 처리되지 않으면서 발생하는 SSTI다.
앞선 lab이 단순히 출력 위치에 들어가는 구조였다면,
이번에는 template expression 안에 값이 들어가는 형태(code context)다.
목표는 동일하다.
Carlos의 홈 디렉토리에 있는 morale.txt 파일을 삭제하는 것.
문제 접근
로그인 후 아무 블로그 글에 댓글을 하나 남긴다.
이후 My account 페이지를 보면
작성자 표시 방식을 선택할 수 있다.
Burp로 보면 이 값은 아래 요청에서 설정된다.
파라미터 값은 blog-post-author-display=user.name과 같은 식이다.
웹 애플리케이션의 다른 기능을 살펴보면, 코멘트 기능을 활성화한 게시판이 있다.
해당 코멘트를 올리면 아래에 사용자의 이름과 함께 콘텐트가 보여지게 된다.
SSTI 여부 확인
방금 살펴봤던 blog-post-author-display파라미터가 user.name으로 설정되어 있기 때문에 유저 이름인
Peter Wiener를 반환하게 되는데, 파라미터 값에다가 SSTI 취약점이 있는지 테스트 해보자.
후보는 이전 실습과 동일하다.
{{7*7}}${7*7}<%= 7*7 %>${{7*7}}#{7*7}
{{7*7}} 은 {{49}}를 반환하는걸 볼 수 있다.
서버가 7*7을 단순히 문자열로 보지않고 계산을 하는걸 확인할 수 있다.
${7*7}를 시도 해보자.
Internal Server Error를 반환,
에러 메시지에서 서버가 Tornado템플릿을 사용하는걸 확인할 수 있다.
Hacktricks에서 Tornado에 대한 documentation을 확인 해본다.
1
2
{% import os %}
{{os.system('whoami')}}
Tornado 템플릿에서는 위처럼 python코드를 실행할 수 있다.
코드 실행으로 확장
이제 템플릿에서 Python 코드를 실행할 수 있는지 확인한다.
Tornado가 지원하는 문법을 적용해서 whoami커맨드를 입력 해본다.
os 모듈을 import해서 시스템 명령을 실행할 수 있다.
1
2
{% import os %}
{{os.system('whoami')}}
이미 blog-post-author-display의 파라미터는
{{$user.name}} 같은 형태로 구성이 되어있기 때문에,
기존 expression을 끊기 위해 user.name}}로 중괄호를 닫아준다.
코드 실행이 되어 carlos를 반환하는걸 확인할 수 있다.
Exploit
목표는 morale.txt파일 삭제다.
ls커맨드로 현재 디렉터리 리스트를 프린트를 해준다.
현재 디렉터리에 있는것을 확인,
rm morale.txt커맨드를 실행하면 파일이 삭제되면서 lab이 마무리 된다.










