인증인가(2)

강혜인·2025년 5월 29일

WEB_Hack

목록 보기
11/18

웹 템플릿 엔진이란?


정의

웹 템플릿 엔진은 동적으로 HTML, XML, JSON 또는 기타 콘텐츠를 생성하는 데 사용되는 도구이다.

서버에서 사용자 입력 데이터나 백엔드 데이터를 기반으로 콘텐츠를 렌더링하여 클라이언트에게 반환한다.

템플릿 엔진은 보통 템플릿 언어(template language)를 사용하며, 특정 문법(예: {{ … }}, ${ … })으로 데이터를 삽입하거나 변수를 조작할 수 있다.

주요 역할

  • 동적 콘텐츠 생성
HTML의 정적 구조에 동적으로 데이터를 삽입
  • 가독성 향상 코드와 HTML이 분리되어 유지보수성과 가독성을 높임
  • 재사용 가능성 템플릿 파일은 여러 곳에서 재사용 가능

템플릿 엔진 종류 및 차이점

템플릿 엔진사용 언어문법특징
Jinja2Python{{…}},
{%…%}- Flask, Django에서 사용
- 강력한 템플릿 상속 및 필터 기능 지원
ThymeleafJava${…}, #{…}- Spring 프레임워크에서 주로 사용
- HTML 친화적(HTML 파일을 직접 렌더링)
TwigPHP{{…}}- Symfony 프레임워크에서 사용
- 가볍고 빠른 템플릿 렌더링
SmartyPHP{…}- 캐싱 및 컴파일 기반으로 높은 성능
- 사용자 정의 기능 확장 가능
HandlebarsJavaScript{{…}}- 클라이언트 측 렌더링
- UI 템플릿에 자주 사용
Mustache다중 언어 지원{{…}}- 가벼운 템플릿 엔진
- 로직 없는 템플릿을 지향

SSTI/디렉터리 인덱싱 취약점


SSTI(Server-Side Template Injection)는 서버에서 템플릿 엔진을 사용해 동적으로 콘텐츠를 생성할 때 발생하는 취약점이다.

템플릿 엔진에서 입력값을 제대로 필터링하지 않으면 공격자가 악성 페이로드를 삽입하여 서버 측 코드 실행이나 데이터 탈취를 할 수 있다.

즉, 웹 템플릿 엔진(Web Template Engine)에 악의적인 사용자의 입력을 통해 임의의 템플릿 기능을 실행하는 공격으로, 템플릿 기능을 악용해 서버 내부의 파일 노출이나 RCE(Remote Code Execution) 취약점까지 연결될 수 있다.

SSTI 취약점의 발생 원인

  • 사용자 입력 값 검증 부족
사용자 입력 값을 신뢰하여 템플릿 렌더링 시 포함
  • 템플릿 엔진의 강력한 기능 많은 템플릿 엔진이 동적으로 변수와 객체를 조작할 수 있는 기능을 제공
  • 설계상 결함 신뢰할 수 없는 입력 값을 서버 코드로 해석하여 실행

공격 원리

  • 동적 렌더링
템플릿 엔진은 사용자가 제공한 데이터를 렌더링하여 HTML이나 문서를 생성한다.
  • 입력값 검증 부족 템플릿 코드가 사용자 입력을 신뢰하여 직접적으로 렌더링에 포함되면, 공격5자가 악성 코드를 삽입할 수 있다.
  • 코드 실행 공격자는 템플릿 엔진이 제공하는 기능을 이용해 서버 측 코드 실행, 파일 읽기, 데이터베이스 쿼리 등을 수행할 수 있다.

취약점이 발생하는 템플릿 엔진

  • 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!`
  • 공격 예제 입력 값에 Jinja2 템플릿 문법을 삽입
    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)또는 필터링 로직에 의해 공격 페이로드가 차단될 수 있다.

공격자는 이를 우회하기 위해 다양한 기술을 사용한다.

  • 우회 기법
    1. 필터링 우회

      일부 필터는 특정 문자열({{, }} , ${…})만을 차단한다.

      이를 우회하기 위해 템플릿 엔진의 다른 문법을 사용한다.

      • Jinja2: {% expression %}
      • Freemarker: #{…} or ?no_esc

      혹은 페이로드를 변경한다.

      • 원래 페이로드 : {{7*7}}
      • 우회 페이로드 : {{7*’7’}}, {% print(7*7) %}
    2. UTF-8 인코딩 활용

      • %7B(URI 인코딩)으로 {를 인코딩
        • %7B%7B7*7%7D%7D
    3. 클래스 속성 우회

      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)
    ```
    
  • WAF(Web Application Firewall) 활용
    • ModSecurity, AWS WAF 등의 도구로 템플릿 문법 패턴을 탐지 및 차단

디렉터리 인덱싱(Directory Indexing)


정의

디렉터리 인덱싱 취약점은 웹 서버가 특정 디렉터리 내의 파일 목록을 사용자에게 노출할 때 발생하는 보안 취약점이다.

이 문제는 서버가 디렉터리의 기본 인덱스 파일(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 등의 로그 파일은 서버 구성 정보 및 잠재적 취약점 탐지를 도와줄 수 있다.
  • 소스 코드
    • PHP, Python, Node.js 등 애플리케이션 코드 파일이 노출되면 공격자는 코드 분석을 통해 추가 취약점을 찾아낼 수 있다.

취약점 악용 방법

디렉터리 리스팅이 활성화된 경우 공격자는 다음과 같은 단계를 통해 취약점을 악용할 수 있다.

  • 디렉터리 파일 목록 확인
    • 노출된 디렉터리 URL에 접근하여 파일 목록을 확인한다.
  • 파일 다운로드
    • 민감한 파일이 존재하는 경우, 이를 직접 다운로드 한다.
      wget http://example.com/uploads/config.php
      wget http://example.com/uploads/backup.zip
  • 민감한 데이터 분석
    • 다운로드한 파일에서 유용한 정보를 추출한다.
      • 데이터베이스 비밀번호, API 키, 사용자 계정 정보 등

취약점 해결 방법

  • 디렉터리 리스팅 비활성화
    • 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 파일이라도 충분히 효과적임
  • 민감한 파일 접근 제한
    • .htaccess 또는 Nginx 설정을 통해 민감한 파일에 대한 접근을 제한
      • Apache 예시
        <FileMatch "\.(log|sql|bak|ini|yml|conf|json)$">
        	Order allow, deny
        	Deny from all
        </FileMatch>
  • 권한 설정 강화
    • 웹 서버에서 민감한 디렉터리와 파일에 대해 적절한 권한을 설정한다.
      • 민감한 디렉터리 권한은 chmod 750 또는 그 이하로 제한

0개의 댓글