SSTI (Server-Side Template Injection)

웹 애플리케이션에서 템플릿 엔진을 사용해 HTML 같은 뷰를 생성할 떄, 사용자의 입력을 검증 하지 않고 템플릿에 삽입할 경우 공격자가 템플릿 내에 임의의 코드를 삽입할 수 있는 취약점입니다.

서버 측에서 임의의 코드가 실행되기에 다양한 공격이 가능합니다. 

때문에 SSTI를 통해 발생하는 임의 코드 실행 (RCE)나 그로 인한 정보 노출, 심하면 서버 장악까지 이어지는 등 위험성이 높은 취약점입니다.

 

공격 방식

사용자의 입력이 템플릿 코드로 해석되면, 공격자는 템플릿 문법을 이용하여 시스템 명령, 변수 접근 등의 악의적 동작을 실행합니다.

워게임을 풀면서 가장 많이 접한 Jinja2를 예로 들면, Jinja2 템플릿 엔진에서 {{ 7*7 }} 이라는 표현식을 넣을 시 7*7이라는 평문으로 인식하는것이 아닌 7 * 7의 수식(명령어)으로서 인식하기에 49라는 결과가 출력됩니다.

{{ .. }} 안에 OS 명령어가 들어갈 시 그 OS 명령어가 그대로 실행되게 됩니다.

 

SSTI 예시

from flask import Flask, request, render_template_string

app = Flask(__name__)

@app.route('/hello')
def hello():
    user_input = request.args.get('user_input')
    template = f"Hello, {user_input}!"
    return render_template_string(template)

 

예시를 위한 간단한 코드입니다.

flask 프레임 워크를 사용하고, 사용자에게 GET 방식으로 user_input에 입력값을 받아 출력해주는 코드입니다.

이때 user_input에 값을 받을 때 아무런 검증이 이루어지지 않아 SSTI에 취약하게 됩니다.

 

user_input에 위에서 예를 든거 처럼 {{ 7*7 }}를 입력하게된다면, 결과값이 출력될 때 

Hello, {{ 7*7 }} 이 아닌 Hello, 49가 출력됩니다.

서버가 7*7이라는 명령어로 인식했기 때문이죠.

 

user_input에 {{ cycler.__init__.__globals__.os.popen("ls").read() }} 를 입력하게되면 OS 명령어인 ls 가 실행되어

그 ls의 결과값이 Hello, 뒤에 붙어 출력될 것입니다.

 

'보안 > 이론 정리' 카테고리의 다른 글

Java - 어노테이션(@)  (0) 2025.09.22
웹 해킹 - SVG 파일과 취약점  (0) 2025.09.19
웹 해킹 - DOM-based XSS  (0) 2025.08.06
Base64에 대한 여러가지  (0) 2025.07.17
curl의 사용법과 보안 활용 정리  (0) 2025.07.09

+ Recent posts