2003
[WEB] SSTI(Server-Side Template Injection) 취약점 - Jinja2 (1) 본문
Backgrounds
웹 프레임워크(Web Framework)
웹 애플리케이션 및 웹 서비스를 개발하기 위한 구조와 도구를 제공하는 소프트웨어 프레임워크이다. 이러한 프레임워크는 특정 언어나 환경에서 웹 개발을 간편하게 하고, 코드의 재사용성, 확장성, 유지보수성을 높이기 위해 일반적인 기능 및 구조를 제공한다.
Django (Python) Python 기반의 웹 프레임워크로, 강력한 기능과 자동화된 admin 기능을 제공한다.
Flask (Python) 가벼우면서도 유연한 Python 웹 프레임워크로, 많은 유연성을 제공하면서도 사용이 간단하다.
웹 템플릿 엔진(Web Template Engine)
동적으로 웹 페이지를 생성하는 데 사용되는 도구로, 서버 측에서 서버 사이드 렌더링(SSR)을 지원한다. 웹 템플릿 엔진은 서버에서 데이터를 가져와 HTML 문서를 생성하고, 그것을 클라이언트에게 전송한다. 클라이언트는 최종적으로 렌더링된 HTML을 받아 화면에 표시한다.
서버 사이드 렌더링(Server-Side Rendering, SSR)
- 검색 엔진 최적화 (SEO): 검색 엔진은 HTML 문서를 읽어 웹 페이지를 색인화하는데, SSR은 초기에 서버에서 HTML을 생성하기 때문에 검색 엔진이 콘텐츠를 더 잘 이해하고 색인화 가능. 이는 SEO(검색 엔진 최적화)에 유리함.
- 성능 향상: 사용자가 페이지를 요청할 때 서버에서 이미 렌더링된 HTML을 전송하므로 초기 로딩 속도가 향상됨. 사용자는 초기에 빠르게 페이지를 볼 수 있고, 클라이언트 측에서 추가적인 자바스크립트 및 데이터를 로드할 수 있음.
- 소셜 미리보기: 소셜 미디어에서 페이지를 공유할 때 SSR을 사용하면, 미리보기는 페이지의 초기 HTML에서 추출되므로, 페이지에 대한 미리보기가 더 정확하게 생성됨.
- 성능 저하를 줄임: 클라이언트 측에서 동적으로 페이지를 생성하는 것에 비해 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 실습 가능



- 상세한 공격 페이로드 및 원리에 대해서 이어집니다.
'보안 > WEB' 카테고리의 다른 글
| [Wargame] Client Side Template Injection (0) | 2024.04.02 |
|---|---|
| [WEB] CSTI(Client Side Template Injection) 취약점 (0) | 2024.02.21 |
| [Wargame] Dreamhack CSRF Advanced (0) | 2024.02.16 |
| [Wargame] CSP Bypass Advanced (0) | 2024.02.14 |
| [WEB] 웹 프레임워크의 역사 (0) | 2024.02.01 |