포스트

SSTI 실습(2) - Tornado Template Injection (Code Context)로 파일 삭제 (PortSwigger Academy)

Tornado 템플릿의 code context에서 SSTI를 이용해 Python 코드 실행 및 파일 삭제 과정 정리

SSTI 실습(2) - Tornado Template Injection (Code Context)로 파일 삭제 (PortSwigger Academy)

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 취약점이 있는지 테스트 해보자.

후보는 이전 실습과 동일하다.

  1. {{7*7}}
  2. ${7*7}
  3. <%= 7*7 %>
  4. ${{7*7}}
  5. #{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이 마무리 된다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.