2003

[WEB] SSTI(Server-Side Template Injection) 취약점 - Jinja2 (1) 본문

보안/WEB

[WEB] SSTI(Server-Side Template Injection) 취약점 - Jinja2 (1)

saya. 2024. 2. 5. 08:43

Backgrounds

웹 프레임워크(Web Framework)

웹 애플리케이션 및 웹 서비스를 개발하기 위한 구조와 도구를 제공하는 소프트웨어 프레임워크이다. 이러한 프레임워크는 특정 언어나 환경에서 웹 개발을 간편하게 하고, 코드의 재사용성, 확장성, 유지보수성을 높이기 위해 일반적인 기능 및 구조를 제공한다.

 

Django (Python) Python 기반의 웹 프레임워크로, 강력한 기능과 자동화된 admin 기능을 제공한다.

Flask (Python) 가벼우면서도 유연한 Python 웹 프레임워크로, 많은 유연성을 제공하면서도 사용이 간단하다.

 

웹 템플릿 엔진(Web Template Engine)

동적으로 웹 페이지를 생성하는 데 사용되는 도구로, 서버 측에서 서버 사이드 렌더링(SSR)을 지원한다. 웹 템플릿 엔진은 서버에서 데이터를 가져와 HTML 문서를 생성하고, 그것을 클라이언트에게 전송한다. 클라이언트는 최종적으로 렌더링된 HTML을 받아 화면에 표시한다.

 

서버 사이드 렌더링(Server-Side Rendering, SSR)

  1. 검색 엔진 최적화 (SEO): 검색 엔진은 HTML 문서를 읽어 웹 페이지를 색인화하는데, SSR은 초기에 서버에서 HTML을 생성하기 때문에 검색 엔진이 콘텐츠를 더 잘 이해하고 색인화 가능. 이는 SEO(검색 엔진 최적화)에 유리함.
  2. 성능 향상: 사용자가 페이지를 요청할 때 서버에서 이미 렌더링된 HTML을 전송하므로 초기 로딩 속도가 향상됨. 사용자는 초기에 빠르게 페이지를 볼 수 있고, 클라이언트 측에서 추가적인 자바스크립트 및 데이터를 로드할 수 있음.
  3. 소셜 미리보기: 소셜 미디어에서 페이지를 공유할 때 SSR을 사용하면, 미리보기는 페이지의 초기 HTML에서 추출되므로, 페이지에 대한 미리보기가 더 정확하게 생성됨. 
  4. 성능 저하를 줄임: 클라이언트 측에서 동적으로 페이지를 생성하는 것에 비해 SSR은 서버에서 페이지를 렌더링하므로 브라우저의 자원을 적게 사용하고 초기 로딩 시간을 최소화함

SSR은 주로 서버 사이드 렌더링을 지원하는 웹 프레임워크에서 사용되며, 예를 들어 Node.js에서는 Next.js, React에서는 Next.js 및 Gatsby 등이 SSR을 지원하는 프레임워크이다. Django와 Flask 같은 Python 기반의 프레임워크도 SSR을 구현할 수 있다.

 

SSTI (Server-Side Template Injection)

웹 어플리케이션에서 서버 측 템플릿 엔진에 발생하는 취약점 중 하나이다. 이 취약점은 사용자의 입력이 서버 측 템플릿 엔진에 직접 삽입되고 실행될 때 발생한다. 즉, 주로 사용자로부터 입력을 받아 템플릿에 동적으로 삽입되는 부분에서 자주 발생한다.

SSTI 취약점을 이용하면 공격자가 서버 측에서 템플릿을 해석하고 실행할 수 있으므로 다양한 공격 시나리오가 가능하다.

 

테스트 환경 구성

1. python 설치

2. python 가상 환경 구축

파이썬 프로젝트를 진행할 때 독립된 환경으로 구성할 수 있어, 플라스크 등의 버전 관리에 유용하다.

 

가상 환경 디렉터리 생성

C:\Users\-> cd \
C:\> mkdir forflask
C:\> cd forflask

가상 환경 만들기

C:\forflask> python -m venv sstiex

가상 환경 진입 / 나가기

C:\forflask> cd C:\forflask\sstiex\Scripts
C:\forflask\sstiex\Scripts> activate
(sstiex) C:\forflask\sstiex\Scripts>

(sstiex) C:\forflask\sstiex\Scripts> deactivate

 

3. Flask 설치

(sstiex) C:\forflask\sstiex\Scripts>pip install flask

 

* https://github.com/pyenv/pyenv 를 이용할 시 가상환경을 편하게 구성 가능

 

4. Flask로 웹 페이지 구성

//app.py
from flask import Flask, request, render_template_string, send_from_directory

app = Flask(__name__)
app.secret_key='FLAG{flag_in_this_dir}'
@app.route('/')
def index():
    search=request.args.get('search') or None

    template='''
        <h2>SSTI vulnerablity test page</h2>
        {}
    '''.format(search)

    return render_template_string(template)

* 코드 출처: https://medium.com/@nyomanpradipta120/ssti-in-flask-jinja2-20b068fdaeee

 

SSTI in Flask/Jinja2

What is SSTI ( Server-Side Template Injection)

medium.com

 

5. Flask 애플리케이션 설정 후 서버 실행

(sstiex) C:\forflask\sstiex\Scripts>set FLASK_APP=app
(sstiex) C:\forflask\sstiex\Scripts>flask run

 

6. 테스트 페이지 확인 가능

 

7. search 파라미터에 페이로드를 삽입하여 SSTI 실습 가능

 

 

- 상세한 공격 페이로드 및 원리에 대해서 이어집니다.