본문 바로가기

보안/XSS

CSP란?

 CSP란 Content Security Policy의 약자로 XSS나 데이터를 삽입하는 류의 공격이 발생하였을때 피해를 줄이고

웹관리자가 공격 시도를 보고 받을 수 있도록 새롭게 추가된 보안계층이다

 

어떻게 피해를 줄이는데?

웹페이지에 사용될 수있는 자원의 위치,출처 등에 제약을 걸어서 공격을 막는다

 

CSP 헤더는 1개 이상의 정책 지시문이 세미콜론(;)으로 분리된 형태로 이루어져있다

정책지시문 EX) default-srcscript-src 등 과 1개 이상의 출처  EX) 'self'https:*.dreamhack.io 

공백으로 분리된 형태로 지정해야한다

 

CSP를 적용하는방법

HTTP헤더의 추가하는방법:

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

이 코드는 내부의 자원들이 같은 오리진 혹은 https://example.dreamhack.io 에서만 로드되어야 함을 나타낸다

 

meta태그로 추가하는방법:

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

위코드랑 똑같은 의미이다

 

CSP는 인라인코드를 사용할수없다.

인라인코드란 태그의 src속성으로 코드를 로드하지않고 태그 내에 직접 코드를 삽입하는것을 의미한다

예를들면 <script>alert(1);</script>는 <script>태그 내에 코드를 직접삽입했기 때문에 인라인코드이다

그러면 어떻게 js를 실행할수있느냐

<script src="alert.js"> 이런식으로 코드를 짜야한다

또한 on*이벤트핸들러속성, javascript:또한 인라인 코드로 간주하고 허용하지않는다

 

그리고 CSP는 문자열 텍스트를 실행가능한 자바스크립트 코드 형태로 변환하는 매커니즘또한 유해하다고 간주한다

예를 들면 eval함수가 있다 eval함수는 문자열을 넣으면 코드를 실행하는 함수이다

또한 new Function(), setTimeout(, ...), setInterval(, ...)과 같이 문자열 형태로 입력을 받는 함수의 실행은 모두차단된다

예를들면 setTimeout("alert(1)", ...) 한 코드가있다 함수에 문자열을 입력받았으므로 허용하지않는다

그러면 이런코드를 짜고싶을때는 어떻게하느냐

함수에 문자열입력이아님 함수형태로 입력하면 된다

예를들면 setTimeout(function(){alert(1)}, ...) 이런식으로 입력값에 함수를 넣으면 CSP에 걸리지않는다

 

지시문의 종류:

default-src -src로 끝나는 모든 지시문의 기본 동작을 제어합니다. 만약 CSP 구문 내에서 지정하지 않은 지시문이 존재한다면 default-src의 정의를 따라갑니다.
img-src 이미지를 로드할 수 있는 출처를 제어합니다.
script-src 스크립트 태그 관련 권한과 출처를 제어합니다.
style-src 스타일시트 관련 권한과 출처를 제어합니다.
child-src 페이지 내에 삽입된 프레임 컨텐츠에 대한 출처를 제어합니다.
base-uri 페이지의 <base> 태그에 나타날 수 있는 URL을 제어합니다.

 

특수목적의 출처:

*://example.com 출처의 scheme은 와일드카드를 이용해 표현할 수 있습니다.
https://*.example.com 출처의 호스트 서브도메인은 와일드카드를 이용해 표현할 수 있습니다. (단, 와일드카드는 호스트의 중간에 들어갈 수 없습니다. i.e) https://www.*.com, https://*.example.*
또한 서브도메인을 와일드카드로 표현할 시, 서브도메인이 붙어있지 않는 도메인은 포함되지 않습니다. i.e) https://*.example.com으로 출처를 표기할 경우, https://example.com은 포함 안됨
https://example.com:* 출처의 포트는 와일드카드를 이용해 표현할 수 있습니다.
none 모든 출처를 허용하지 않습니다.
self 페이지의 현재 출처 (Same Origin) 내에서 로드하는 리소스만 허용합니다.
unsafe-inline 예외적으로 인라인 코드의 사용을 허용합니다.
unsafe-eval 예외적으로 eval 과 같은 텍스트-자바스크립트 변환 메커니즘의 사용을 허용합니다.
nonce-<base64-value> nonce 속성을 설정하여 예외적으로 인라인 코드를 사용합니다. <base64-value>는 반드시 요청마다 다른 난수 값으로 설정해야 합니다. 해당 출처를 설정하면 unsafe-inline 은 무시됩니다.
<hash-algorithm>-<base64-value> script 혹은 style 태그 내 코드의 해시를 표현합니다. 해당 출처를 설정하면 unsafe-inline은 무시됩니다.

'보안 > XSS' 카테고리의 다른 글

자바스크립트 필터링 우회하는방법  (0) 2024.05.28
XSS 우회하는 방법 모음  (0) 2024.05.26
XSS공격 가능한 태그,속성 모음  (0) 2024.05.26