SERVER SIDE TEMPLATE INJECTION 개요

코딩 파인애플·2026년 6월 19일
post-thumbnail

안녕하십니까
코딩사과의 짭 코딩 파인애플입니다
이번 시간에는 SERVER SIDE TEMPLATE INJECTION에 관해 알아보겠습니다.

SERVER SIDE TEMPLATE INJECTION이란?

서버 사이드 템플릿 인젝션은 웹 애플리케이션에서 발생하는 매우 위험한 취약점 중 하나입니다

SSTI는 단순한 데이터 유출을 넘어 서버 전체를 장악할 수 있는 RCE(Remote Code Execution, 원격 코드 실행)로 이어지는 경우가 많아 매우 치명적입니다

공격자가 서버의 템플릿 엔진에 악성 입력값을 주입하여, 서버가 이를 단순한 텍스트가 아니라 실행 가능한 코드로 인식하게 만드는 공격입니다

템플릿 엔진은 지정된 템플릿 양식과 데이터를 결합하여 HTML 문서를 출력하는 SW를 의미합니다.

정상적인 구조라면 개발자가 작성한 템플릿 틀 안에 사용자의 데이터가 삽입되어야 되는데 사용자가 입력한 값을 검증하지 않고 템플릿 문자열 자체로 처리할 때 취약점이 발생합니다.

(개발자 말 좀 들어라.png)

템플릿 엔진에 따라 코드가 다른데 Python Jinja2를 기준으로 설명할 것이니 참고하시길 바랍니다

@app.route('/render', methods=['POST'])
def vulnerable_render():
    
    template_input = request.form.get('template', '')
    result = render_template_string(template_input)
    
    return f'''
    <h2>렌더링 결과:</h2>
    <pre>{result}</pre>
    <a href="/">돌아가기</a>
    '''

위 코드의 경우에도 사용자 입력(template_input)을 검증 없이 받음과 동시에 render_template_string()으로 동적 템플릿 생성합니다

그러므로 공격자가 Jinja2 표현식을 삽입할 수 있는 취약점이 존재합니다

jinja2는 기본적으로 "{{ 내용물 }}" 의 기본 식별자를 사용하기 떄문에 공격자는 {{ 내용물 }}을 통해 기본적인 공격을 할 수 있습니다

다음과 같이 기본적인 67산수를 통해서도 서버가 실행해 SSTI가 가능한 취약점임을 알 수 있습니다
{{self.__init__.__globals__.__builtins__.__import__('os').popen('etc').read()}}

위 코드는 ssti 공격을 할 때 사용되는 os.popen()을 이용한 페이로드입니다 하나하나 뜯어봅시다.

self : 현재 템플릿 컨텍스트 객체
.init : 생성자 메서드 (초기화 함수) 해당 함수로 그 모듈의 전역 변수들에 접근할 수 있습니다.
.globals : 함수가 정의된 모듈의 전역 네임스페이스 (전역 변수 저장소)
.builtins : Python 내장 함수 모음 모듈, 앞으로 사용할 공격 함수들이 내장되어 있습니다
.import('os') : 동적으로 모듈을 import하는 함수 (import os와 같은 의미)
.popen('리눅스 명령어') : 시스템 명령을 실행하는 함수 Linux명령어를 실행
read() : 파일이나 스트림의 내용을 문자열로 읽는 함수

그 외에도 popen() 을 이용할 것 말고도 subproces()이나 eval()도 있지만 다음에 설명하겠습니다.

한번 배웠던 내용을 실습해봅시다
https://dreamhack.io/wargame/challenges/39

이상으로 글을 마치겠습니다 감사합니다

profile
안녕하떼요 취미로 콤푸타 배우는 고든학교 6학년 유치원생이빈다.

0개의 댓글