SSTI(Server Side Template Injection)
공격자가 서버측의 기본 템플릿 구문을 이용하여 악성 페이로드를 삽입한 다음 서버 측에 실행되면서 생기는 취약점이다.
웹 템플릿 엔진마다 사용되는 페이로드가 다르다.
(여기선 Jinja에 대해서만 알아보겠다)
파이썬에는 MRO라는 기능이 구현되어있다.
https://ssongkit.tistory.com/138
MRO는 상속한 클래스들의 공통된 메서드에 대한 우선 순위를 정해준다.
취약점 점검
Flask의 경우 문서에 따르면 따로 정의하지 않은 이상 Jinja2 템플릿을 사용하게 되는데
만약 사용자가 입력한 값이 템플릿 구문으로 인식하게 할 수 있다면
해당 템플릿 구문을 이용하여 SSTI취약점을 발생시켜 RCE(Remote Code Execute) 취약점으로 연계시킬 수 있다.
SSTI 취약점이 존재할 때 {{7*7}} 을 입력하면 {{7*7}}이 아닌 49가 나오게 된다.
기본적으로 Flask의 경우 app.n에 들어가는 대부분의 정보들이 config 클래스에 들어가게 된다.
만약 app.secret_key에 중요한 정보를 넣었을 때 {{config}} 해당 페이로드를 삽입하여
config 정보를 출력하게 만들면 app.secret_key에 들어간 중요한 정보들이 나오게 된다.
RCE(Remote Code Execute)
RCE는 원격 코드 실행으로 어떠한 시스템에 접근하여 명령어를 실행할 수 있는 취약점이며 SSTI와 연계가 가능하다.
일반적으로 os.system 같은 함수의 경우 쉘 명령어의 결과를 출력할 수 없기 떄문에
subprocess.Popen Class를 찾은 다음 함수를 실행시켜 셸 명령어 결과를 출력한다.
필터링 우회(filtering bypass)
<dot(.)이 필터링 되는 경우>
[], (), attr()|attr() 를 이용하여 우회
<특정 키워드가 필터링 되는 경우>
attr() 함수를 사용하거나 [] 대괄호를 이용하여 문자열로 메서드를 호출할 수 있다.
그 외에도 ascii hex, ascii oct, 16bit unicode, 32bit unicode를 이용하여 우회
<{{}} 중괄호가 필터링 되는 경우>
{% %}으로도 실행 가능
<underscore(_)가 필터링 되는 경우>
\x5f, \137, \u005F, \U0000005F, request.args.get('under') 등을 사용하여 우회
마지막으로 dot(.), underscore(_), 대괄호([])가 동시에 필터링될 때 사용하는 페이로드를 하나 소개하고 마치겠다.
{{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')()}}
레퍼런스에 다양한 페이로드들이 소개되어 있다.
레퍼런스
https://me2nuk.com/SSTI-Vulnerability/
https://hackmd.io/@Chivato/HyWsJ31dI
'background > web' 카테고리의 다른 글
[NoSQL] Redis DBMS (0) | 2022.11.24 |
---|---|
[NoSQL] CouchDB (0) | 2022.11.24 |
XXE Injection 이해를 위한 XML 기초 지식 (0) | 2022.08.29 |
XXE(XML External Entity) Injection (0) | 2022.08.27 |
[MySQL] select 문의 where 절에서 문자열과 숫자의 비트 연산으로 테이블의 모든 데이터 출력되는 현상 (0) | 2022.08.09 |