CSTI란?
클라이언트 사이드 템플릿 엔진을 사용해 동적으로 콘텐츠를 생성할 때, 공격자가 악성 스크립트를 삽입해 이를 실행시키는 공격 -> XSS와 같은 공격에 취약 (Web Template Engine이란?)
Client Side Template을 사용한 웹 페이지에서 사용자의 동작에 따라 동적으로 DOM을 생성할 때 XSS에서 사용되는 페이로드가 주입되면 DOM XSS로 이어지게 됩니다.
<!DOCTYPE html>
<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.13/dist/vue.js"></script>
</head>
<body>
<div id="test">
<h1><?php echo ($_GET['test']); ?></h1>
</div>
<script>
new Vue({
el: '#test'
});
</script>
</body>
</html>
위와 같이 파라미터 값을 Client Side Template로 출력시키는 환경에서
템플릿 구문에 수학식을 입력하였을 때, 해당 식이 그대로 출력되는 것이 아닌, 계산 결과가 출력되는 경우 CSTI가 가능하다는 것임을 확인할 수 있습니다.
하지만 무조건 결과가 출력되어야만 CSTI가 가능한 것은 아닙니다. 어떤 템플릿 환경에서는 해당 수학식이 그대로 출력되어도 CSTI 공격이 가능할 수 있습니다.
CSTI가 가능한 환경임을 템플릿 구문으로 확인하였다면 XSS구문을 constructor과 같은 객체를 사용해 입력해 주면 XSS 공격으로 이어질 수 있게 됩니다.
constructor은 코드를 동적으로 생성하고 실행할 수 있는 객체로 자바스크립트 코드를 실행할 수 있습니다. 이 외에도 각 템플릿에서 제공되는 객체 또는 기능을 통해 CSTI를 시도할 수 있습니다.
템플릿 구문
CSTI 가능 여부는 아래와 같은 페이로드를 통해 확인해 볼 수 있습니다.
- {{9*9}}
- ${9*9}
- ${{9*9}}
- <%= 9*9 %>
- #{9*9}
SSTI와 CSTI의 차이
두 공격 모두 Web Template Engine에서 이루어지는 공격이지만 Server Side와 Client Side 중 어떤 템플릿 엔진에서 이루어지는 지에 대한 차이가 존재합니다. 보통 CSTI는 클라이언트에서 이루어지는 공격으로 세션과 쿠키를 탈취는 것이 가능하지만, SSTI는 서버의 데이터에 접근할 수 있기 때문에 서버의 데이터를 훼손하거나, 서버를 장악할 수 있는 공격이 가능하기 때문에 CSTI보다 위험도가 조금 더 높은 공격이라 볼 수 있습니다. ( SSTI란? )
대응 방안
- 필요한 데이터만 사용할 때 -> 화이트 리스트 필터링
- 사용자 입력값을 사용할 때 -> 블랙리스트 필터링
- Sandboxing -> 우회 가능성이 있기 때문에 여러 대응 방안과 함께 사용해야 함
참고
https://gayunkim-1.tistory.com/m/44
https://velog.io/@silver35/Web-Client-Side-Template-InjectionCSTI
'Web > Web Hacking' 카테고리의 다른 글
JWT(JSON Web Token) Attacks (0) | 2024.11.16 |
---|---|
SSTI (Server Side Template Injection) (4) | 2024.10.25 |
GraphQL Injection (2) | 2024.09.25 |
NoSQL Injection (0) | 2024.09.07 |
XXE External Entities (0) | 2024.09.06 |