정의
웹 템플릿 엔진은 동적으로 HTML, XML, JSON 또는 기타 콘텐츠를 생성하는 데 사용되는 도구이다.
서버에서 사용자 입력 데이터나 백엔드 데이터를 기반으로 콘텐츠를 렌더링하여 클라이언트에게 반환한다.
템플릿 엔진은 보통 템플릿 언어(template language)를 사용하며, 특정 문법(예: {{ … }}, ${ … })으로 데이터를 삽입하거나 변수를 조작할 수 있다.
주요 역할
- 동적 콘텐츠 생성
HTML의 정적 구조에 동적으로 데이터를 삽입
템플릿 엔진 종류 및 차이점
| 템플릿 엔진 | 사용 언어 | 문법 | 특징 |
|---|---|---|---|
| Jinja2 | Python | {{…}}, | |
| {%…%} | - Flask, Django에서 사용 | ||
| - 강력한 템플릿 상속 및 필터 기능 지원 | |||
| Thymeleaf | Java | ${…}, #{…} | - Spring 프레임워크에서 주로 사용 |
| - HTML 친화적(HTML 파일을 직접 렌더링) | |||
| Twig | PHP | {{…}} | - Symfony 프레임워크에서 사용 |
| - 가볍고 빠른 템플릿 렌더링 | |||
| Smarty | PHP | {…} | - 캐싱 및 컴파일 기반으로 높은 성능 |
| - 사용자 정의 기능 확장 가능 | |||
| Handlebars | JavaScript | {{…}} | - 클라이언트 측 렌더링 |
| - UI 템플릿에 자주 사용 | |||
| Mustache | 다중 언어 지원 | {{…}} | - 가벼운 템플릿 엔진 |
| - 로직 없는 템플릿을 지향 |
SSTI(Server-Side Template Injection)는 서버에서 템플릿 엔진을 사용해 동적으로 콘텐츠를 생성할 때 발생하는 취약점이다.
템플릿 엔진에서 입력값을 제대로 필터링하지 않으면 공격자가 악성 페이로드를 삽입하여 서버 측 코드 실행이나 데이터 탈취를 할 수 있다.
즉, 웹 템플릿 엔진(Web Template Engine)에 악의적인 사용자의 입력을 통해 임의의 템플릿 기능을 실행하는 공격으로, 템플릿 기능을 악용해 서버 내부의 파일 노출이나 RCE(Remote Code Execution) 취약점까지 연결될 수 있다.
SSTI 취약점의 발생 원인
- 사용자 입력 값 검증 부족
사용자 입력 값을 신뢰하여 템플릿 렌더링 시 포함
공격 원리
- 동적 렌더링
템플릿 엔진은 사용자가 제공한 데이터를 렌더링하여 HTML이나 문서를 생성한다.
취약점이 발생하는 템플릿 엔진
- Jinja2(Python): {{ … }}
- Thymeleaf(Java): ${ … }
- Freemarker(Java): ${ … }
- Twig(PHP): {{ … }}
- Smarty(PHP): { … }
SSTI 동작 원리
- 템플릿 렌더링 예제
**Python Flask + Jinja2**
```python
form flask import Flask, request, render_template_string
app = Flask(__name__)
@app.route('/greet', methods=['GET'])
def greet():
name = request.args.get('name', 'World')
template = f"Hello {name}!"
return render_template_string(template)
```
→ URL 파라미터 `name` 의 값을 직접 템플릿으로 전달하여 렌더링
```arduino
http://example.com/greet?name=John
```
→ 결과 : `Hello John!`
http://example.com/greet?name={{7*7}} → 결과 : Hello 49!공격자가 이를 악용 할 경우, 서버에서 원격 코드 실행(RCE)과 같은 치명적인 피해 초래 가능
http://example.com/greet?name={{''.__class__.__mro__[1].__subclasses__()[40]('/etc/passwd').read()}}
→ 결과 : /etc/passwd 파일 내용이 유출
SSTI 취약점 우회
SSTI를 방어하거나 취약점을 탐지하는 과정에서 WAF(Web Application Firewall)또는 필터링 로직에 의해 공격 페이로드가 차단될 수 있다.
공격자는 이를 우회하기 위해 다양한 기술을 사용한다.
필터링 우회
일부 필터는 특정 문자열({{, }} , ${…})만을 차단한다.
이를 우회하기 위해 템플릿 엔진의 다른 문법을 사용한다.
{% expression %}#{…} or ?no_esc혹은 페이로드를 변경한다.
{{7*7}}{{7*’7’}}, {% print(7*7) %}UTF-8 인코딩 활용
%7B(URI 인코딩)으로 {를 인코딩클래스 속성 우회
Jinja2의 경우, .__class__ 속성을 활용해 우회
{{config}}{{’’.__class__.mro[1].subclasses[40]}}{{ ‘’.__class__.__mro__[1].__subclasses__()[40](’/etc/passwd’).read() }}{{ ‘’.__class__.__mro__[1].__subclasses__()[59](’ls’,shell=True,stdout=-1).stdout.read() }}{{ config.items() }}SSTI 대응 방안
- 입력 값 검증
- 사용자 입력을 템플릿 엔진에 전달하기 전에 화이트리스트 기반 검증 적용
- 신뢰할 수 없는 데이터는 반드시 이스케이프(escape) 처리
- 템플릿 엔진 보안 설정
- Jinja2 :
autoescape=True설정으로 HTML 이스케이프 활성화- 템플릿 엔진의 최신 버전을 사용하여 알려진 취약점을 제거
- 템플릿 코드에서 사용자 입력 제거
- 사용자 입력을 템플릿에서 직접 사용하지 않고, 로직으로 분리
```python
return render_template('greet.html', name=name)
```
정의
디렉터리 인덱싱 취약점은 웹 서버가 특정 디렉터리 내의 파일 목록을 사용자에게 노출할 때 발생하는 보안 취약점이다.
이 문제는 서버가 디렉터리의 기본 인덱스 파일(index.html or index.php)을 제공하지 못하거나, 디렉터리 리스팅(Directory Listing)기능이 활성화되어 있을 때 발생한다.
공격자는 디렉터리 내의 파일 목록을 열람하면서 민감한 정보(설정 파일, 로그 파일, 소스 코드, 백업 파일 등)를 확인하거나 다운로드하여 악용할 수 있다.
취약점 발생 조건
- 서버에서 디렉터리 리스팅이 활성화된 경우
- Apache:
Options +Indexes설정이 활성화된 경우- Nginx:
autoindex on;설정이 활성화된 경우- IIS: 디렉터리 브라우징(Directory Browsing)이 활성화된 경우
- 디렉터리 내에 기본 인덱스 파일이 없는 경우
- 예를 들어,
/var/www/html/uploads디렉터리에index.html이나index.php파일이 없으면 웹 서버는 디렉터리 목록을 자동으로 노출할 수 있다.- 웹 애플리케이션에 대한 파일 접근 제한이 설정되지 않은 경우
.htaccess,robots.txt등으로 디렉터리 접근을 차단하지 않은 경우- 민감한 파일에 대해 서버에서 적절한 접근 권한이 설정되지 않은 경우
공격자가 악용 가능한 파일의 예시
공격자는 디렉터리 리스팅을 통해 다음과 같은 민감한 정보를 포함한 파일을 찾을 수 있다.
config.php, database.yml 등에서 DB 계정 정보, API 키, 비밀번호 등이 포함될 수 있다.backup.zip, database.sql 등의 백업 파일이 공개되어 있으면 공격자는 파일을 다운로드하여 내부 데이터를 탈취할 수 있다.access.log, error.log 등의 로그 파일은 서버 구성 정보 및 잠재적 취약점 탐지를 도와줄 수 있다.취약점 악용 방법
디렉터리 리스팅이 활성화된 경우 공격자는 다음과 같은 단계를 통해 취약점을 악용할 수 있다.
wget http://example.com/uploads/config.php
wget http://example.com/uploads/backup.zip취약점 해결 방법
- 디렉터리 리스팅 비활성화
- Apache
httpd.conf또는.htaccess파일에서Options -Indexes로 디렉터리 리스팅 비활성화
```bash
<Directory /var/www/html>
Options -Indexes
</Directory>
```
- Nginx
- Nginx 설정 파일에서 `autoindex off;` 로 디렉터리 리스팅 비활성화
```bash
location / {
autoindex off;
}
```
- IIS
- IIS 관리자에서 디렉터리 브라우징을 비활성화
index.html 또는 index.php 파일을 추가해 파일 목록 노출을 방지index.html 파일이라도 충분히 효과적임<FileMatch "\.(log|sql|bak|ini|yml|conf|json)$">
Order allow, deny
Deny from all
</FileMatch>chmod 750 또는 그 이하로 제한