-
[A03:2021 – Injection] SSTI (Server Side Template Injection) 취약점 분석Hacking/개념 및 이론 2025. 5. 25. 01:32728x90반응형
[Web Hacking] picoCTF WebShell SSTI1
평소 궁금했던 해킹을 공부하기 위해 OverTheWire Bandit 문제들을 끝내고, “그럼 이제 진짜 CTF를 한번 풀어보자” 싶어서 맨땅에 헤딩하듯 도전했습니다.1. 시작일단 문제를 열었더니 무슨 폼이 하
jangto.tistory.com
해당 CTF를 풀 때 사용했던 SSTI (Server Side Template Injection)에 대해 제대로 알아보겠습니다.
SSTI 취약점은 특히 동적 HTML 응답을 생성하는 서버 측 템플릿 기술에서 자주 발견됩니다.
해당 문제는 RCE (Remote Code Execution) 문제로 이어질 수 있기 때문에 강력한 취약점입니다.
아래에 설명한 예시는 CTF에서 사용했을 것이라고 예상되는 Jinja2로 취약점을 재구성하여 왜 위험한지 알아보겠습니다.
@app.route("/kuku") def greet(): name = request.args.get("name", "") template = f"Hello {name}" // 🧨사용자 입력을 직접 f-string 포매팅합니다. return render_template_string(template) // 🧨취약점 발생
위 예시의 동작 흐름을 알아보겠습니다.
일반적인 시나리오
- curl -g 'http://www.test.com/kuku?name=kururu'
- name 변수에 "kururu"라는 문자열이 할당됩니다.
- template 변수에는 "Hello kururu"라는 문자열이 할당됩니다.
- render_template_string() 함수를 호출하여 Jinja2가 렌더링 후 화면에 출력해 줍니다.
- 화면에는 Hello kururu라고 출력됩니다.
참고 사항
render_template_string()에 대해 좀 더 알아보겠습니다.
- 파싱
- 문자열을 Jinja2 문법에 따라 파싱 하여 템플릿 객체 생성합니다.
- 변수 바인딩 및 표현식 평가
- {{ ... }} 및 {% ... %} 문법을 실행 가능한 코드로 처리합니다.
- 문자열 렌더링
- 치환된 문자열을 완성하여 HTML 등 응답 본문으로 반환합니다.
SSTI 공격 시나리오
- curl -g 'http://www.test.com/kuku?name={{2*2}}'
- name 변수에 "{{2*2}}"라는 문자열이 할당됩니다.
- template 변수에는 "Hello {{2*2}}"라는 문자열이 할당됩니다.
- render_template_string() 함수를 호출하여 Jinja2가 렌더링 후 화면에 출력해 줍니다.
- 화면에는 Hello 4라고 출력됩니다.
728x90반응형'Hacking > 개념 및 이론' 카테고리의 다른 글
WiFi 접속 시 DHCP 작동 원리와 OSI 7계층 흐름 (0) 2025.07.17 Port 53에서 시작되는 은밀한 통신 DNS 이야기 (0) 2025.07.02 [웹 보안의 기초 정리] Cookie, SameSite, CORS, ACAO (2) 2025.06.23 [Hash Algorithm] 해시 길이 정리 (MD5, SHA-1, SHA-256, SHA-512) (0) 2025.05.26