반응형
문제 정의
- Flask 애플리케이션에서 **SECRET_KEY**가 환경 변수 FLAG로 설정.
- 초기 분석 시, FLAG 값이 가짜 플래그로 보였으나 실제 플래그였음.
- 목표: SSTI 취약점을 이용해 SECRET_KEY를 노출시키고, 플래그를 획득.
문제 분석
Flask 애플리케이션 취약점
- SSTI(Server-Side Template Injection)
- 사용자 입력이 Flask 템플릿 엔진 Jinja2에서 실행됨.
- 입력값이 서버에서 적절히 필터링되지 않고 실행되며 발생.
- 플래그 저장 방식
- SECRET_KEY에 환경 변수 FLAG 값이 설정됨.
- Flask의 config 객체를 통해 SECRET_KEY 값을 확인 가능.
플래그 획득 과정
1. SSTI 취약점 확인
- 기본 테스트: SSTI 취약점 여부를 확인하기 위해 템플릿 코드 테스트:
- 결과: 서버에서 49를 반환하며, 입력이 템플릿으로 실행됨을 확인.
{{ 7*7 }}
2. Flask 설정 접근
- Flask에서 설정 값은 config 객체에 저장:
-
{{ config }}
- 테스트 코드: config.items()를 호출해 모든 설정 항목 확인:
-
{{ config.items() }}
- 결과:
- Flask 애플리케이션의 설정 값이 출력.
- SECRET_KEY 값에 FLAG 환경 변수 값이 포함됨.
3. 최종 플래그 획득 코드
- 다음 코드를 템플릿 인젝션 입력 필드에 삽입:
{{ config.items() }}
- 결과: SECRET_KEY 값이 출력되며 플래그 획득:
SSTI 취약점 정리
1. SSTI란?
- 서버 측 템플릿 처리 과정에서, 사용자의 입력이 템플릿 코드로 실행될 때 발생하는 취약점.
- 결과적으로:
- 민감 정보 노출
- 원격 코드 실행(RCE)
- 파일 시스템 접근 등의 문제를 유발.
2. Flask와 Jinja2
- Flask의 기본 템플릿 엔진은 Jinja2.
- {{ }}: 템플릿 내에서 Python 코드를 실행할 수 있는 구문.
3. 취약점 발생 원인
- 사용자의 입력이 템플릿 엔진을 통해 그대로 실행.
- 입력값에 대한 적절한 필터링 미비.
보안 대책
1. 사용자 입력 검증
- 템플릿에서 실행되는 사용자 입력을 화이트리스트로 검증.
2. render_template_string 사용 금지
- Jinja2의 render_template_string 대신, 안전한 방식으로 템플릿을 렌더링:
- render_template 사용.
- 데이터는 템플릿 변수로 전달하며 직접 실행 방지.
3. 환경 변수 보호
- 민감한 정보를 환경 변수에 저장할 경우:
- 접근 제한 강화.
- 디버그 로그에 출력되지 않도록 설정.
반응형
'Security > CTF' 카테고리의 다른 글
| 12.2 IDOR (0) | 2025.01.22 |
|---|---|
| 12.1 Business_logic_error (0) | 2025.01.22 |
| 8.1 SSTI - server flag (0) | 2025.01.22 |
| 3.3 SQLi_WAF_3 (0) | 2025.01.22 |
| 3.1 SQLi_WAF_1 (0) | 2025.01.22 |