Client-Side Template Injection (이하 csti)는 Server-Side Template Injection(이하 ssti)와
웹 템플릿 엔진에 공격자의 공격 코드가 템플릿에 포함된 상태에서 공격자의 공격코드가 인젝션 되어진다는 것에서 같다.
말 그대로 server 와 client의 차이가 존재할 뿐이다.
Client Side에서 Javascript를 실행 할 수 있기 때문에, XSS 취약점과 연계 가능하다는 것이 일감이다.
CSTI의 취약성은 클라이언트측 템플릿 프레임워크를 사용하는 응용프로그램이 웹 페이지에 사용자 입력을 동적으로 포함할 때 발생한다.
당연하게도 ssti와 같이 템플릿 엔진에 따라 사용할 수 있는 payload 와 공격 방식이 다르다.
대표적인 프론트엔드 프레임워크에는
Angular / React.js(typescript 기반 프레임워크), Vuejs(javascript 프레임 워크) 가 있다.
이에 대한 자세한 설명은 링크에서 확인할 수 있다.
https://www.samsungsds.com/kr/insights/frameworks.html
Template Injection이 발생할 때 XSS공격과 연계하기 위해 js 코드 실행으로 연계하는 방법으로는 보통 constructor을 이용한다.
SSTI 와 비슷하게,
- {{9*9}}
- ${9*9}
- ${{9*9}}
- <%= 9*9 %>
- #{9*9}
과 같은 간단한 연산들로 체크 해볼수 있다.
VueJS
vue.js에서 constructor에 접근하는 방법 중 하나인 {{_Vue.h.constructor}} 을 이용해 접근할 수 있다.
기본적으로는 다음과 같은 payload로 alert를 띄워 볼 수 있다.
{{_Vue.h.constructor("alert(1)")()}}
{{_openBlock.constructor('alert(1)')()}} (v3)
- bypass payloads
https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#vuejs-reflected
만약 페이지가 v-html 을 사용한다면 xss 를 시도해 볼수도 있다
v-html 이란
Vue 템플릿 문법을 처리하지 않고 일반 HTML 코드로 삽입.
따라서 XSS 공격에 사용될 수 있다.
아래는 공식 문서의 XSS 위협 경고이다
AngularJS
AngularJS template에서 constructor에 접근하는 방법으로는 {{ constructor.constructor }} 가 있다.
{{ constructor.constructor("alert(1)")() }}
또한, ng-app 함수로 해당 라인부터 AngularJS를 사용하겠고 선언 한다.
<html ng-app>{{ constructor.constructor("location='vuln?param='+document.cookie")() }}</html>
-payloads
https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#vuejs-reflected
'Web > Website security' 카테고리의 다른 글
toLowerCase(), toUpperCase() 유니코드 우회 (1) | 2024.04.02 |
---|---|
[SSRF / LFI] Bypass WAF with url globbing (1) | 2023.11.20 |
Content-Security-Policy (CSP) 정책 총정리 (+bypass) (0) | 2022.12.01 |
SSRF(Server-Side-Request-Forgery) 를 위한 다양한 URI scheme 정리 (0) | 2022.11.10 |
UUID v1 사용은 안전하지 않습니다 (0) | 2022.10.11 |