웹해킹

Content Security Policy & CSP Bypass

bluesunset 2023. 11. 24. 19:23

CSP는 xss나 데이터를 삽입하는 공격이 발생했을 때 피해를 줄이고 공격 시도를 보고 받을 수 있게

하기 위해 새롭게 추가된 보안계층이다.

 

CSP는 웹 페이지에 사용될 수 있는 자원의 위치, 출처에 제약을 걸 수 있다.

Content-Security-Policy: default-src 'self' https://example.dreamhack.io

HTTP 헤더를 이용한 CSP 헤더 정의 방법이다.

<meta http-equiv="Content-Security-Policy" content="default-src 'self' https://example.dreamhack.io">

비슷하게 meta 태그로도 정의할 수 있다.

 

CSP는 scipt 태그 내에 코드를 삽입하는 것 포함, 이벤트 핸들러 속성, URL 스킴 등을

인라인 코드로 간주하고 허용하지 않는다.

또한, eval, setTimeout 등 문자열로부터 코드를 실행하는 함수의 실행을 유해하다고 간주해 차단한다.

 

Policy-directive는 directive, value 형태로 구성된다.

directive는 지시문으로, 어떤 리소스에 대한 출처를 제어할지 결정한다.

이런 것들이 있다.

value에는 리소스의 출처를 정의한다.

 

CSP 구문이 잘못되었을 경우 이를 우회할 수 있다.

CSP에서 허용하는 출처가 JSONP API를 지원하면, callback 파라미터에 원하는 스크립트를 삽입할 수 있다.

예를 들어 *.google.com을 허용하면

https://accounts.google.com/o/oauth2/revoke?callback=alert(1);

이런 식으로 요청을 할 수 있다.

 

nonce 예측을 통해서도 우회를 할 수 있다.

nonce가 요청을 보낼 때마다 같은 값이 반환되는 경우에 nonce 값을 알아내서 

<script nonce="{고정된 nonce 값}">alert(1);</script>

이런 식으로 사용할 수 있다.

 

HTML 파일에서 url을 통해 파일을 읽어오거나 할 때 base로 지정된 url을 기준으로 읽어온다.

<base href="https://malice.test/xss-proxy/">

이런 코드를 넣게 되면 HTML 태그 상에서 읽어오는 경로를 바꿀 수 있다.

이를 막기 위해 CSP에서 base-uri 를 none으로 설정해야 한다.