2003

[Wargame] Client Side Template Injection 본문

보안/WEB

[Wargame] Client Side Template Injection

saya. 2024. 4. 2. 14:25

Exercise: Client Side Template Injection에서 실습하는 문제입니다.

 

Client Side Template Injection

  • 사용자의 입력 값이 client side template framework에 의해 템플릿으로 해석되어 렌더링 될 때 발생함
  • 이를 악용하여 악성 스크립트를 실행하거나 사용자의 브라우저에서 다른 액션을 취하도록 유도할 수 있음

 

Base

 

1. vuln

 

param 파라미터로 받은 값을 뿌려주기 때문에 태그 등의 삽입이 가능합니다.

 

2. memo

 

memo 파라미터로 받은 문자열을 메모로 생성하여 저장하고 화면에 나타냅니다.

 

3. flag

 

POST 방식으로 param 전달 시, 쿠키에 FLAG를 포함해 check_xss 함수를 호출합니다. check_xss read_url 함수를 호출해 vuln 엔드포인트에 접속합니다.

Exploit

 

1) CSP 정책 확인

@app.after_request
def add_header(response):
    global nonce
    response.headers['Content-Security-Policy'] = 
    f"default-src 'self'; 
    img-src https://dreamhack.io; 
    style-src 'self' 'unsafe-inline'; 
    script-src 'nonce-{nonce}' 'unsafe-eval' https://ajax.googleapis.com; 
    object-src 'none'"
    
    nonce = os.urandom(16).hex()
    return response

 

script의 경우 삽입시 nonce가 필요하며, https://ajax.googleapis.com 에서 불러오는 스크립트일 경우 허용됩니다. 또한 unsafe-eval의 경우 JavaScript의 eval() 함수와 유사한 동적 코드 실행을 허용하는 지시어입니다.

 

https://ajax.googleapis.com 의 경우 Google의 호스팅 서비스를 통해 제공되는 외부 자바스크립트 라이브러리 및 기타 리소스에 대한 엔드포인트입니다. 이를 통해 여러 가지 라이브러리를 불러와 웹 페이지에 적용할 수 있습니다. 또한 AngularJS 파일을 서빙할 때에도 사용되는 서버로 AngularJS 파일을 script 태그의 src로 사용한 후, Client Side Template Injection을 수행할 수 있습니다.

 

script 태그의 src로 로드할 AngularJS 파일은 https://ajax.googleapis.com/ajax/libs/angularjs/1.8.3/angular.min.js

해당 출처를 사용하여 파일을 로드하고 html이나 body 태그 내에 ng-app 속성을 추가하여 AngularJS를 사용함을 알릴 수 있습니다. 

 

2) Client Side Injection 페이로드 작성

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.8.3/angular.min.js"></script>
<html ng-app>{{ constructor.constructor("location='memo?memo='+document.cookie")() }}</html>

 

 

1. 스크립트 출처로 사용할 Angular JS 파일 불러오기

2. AngularJS 를 사용하기 위한 <html ng-app> 태그 사용: 이 지시자는 HTML 앨리먼트가 Angular 로 하여금 우리의 어플리케이션의 루트 어플리케이션으로 인식하도록 하고 개발자로 하여금 Angular가 HTML 페이지 전체 혹은 그 일부분만을 AngularJS 어플리케이션으로 다룰지를 알려주는 역할을 수행

3. constructor 생성자를 활용하여 자바스크립트 코드가 실행될 수 있도록 함

 

3) get FLAG