<보안 study>/웹

CSP(Content-Security-Policy) 정리

gosoeungduk 2021. 8. 23. 02:25
반응형

#CSP #Content-Security-Policy #Web


<CSP(Content-Security-Policy)>

공격자가 xss 로 웹에 허용되지 않은 script 를 삽입하거나 외부페이지에 혹은 외부페이지로 부터 HTTP 요청 을 보내는 것을 막을 수 있도록 Response Header 에 마련된 정책이다.

CSP 는 웹 서버에서 Content-Security-Policy 헤더를 리턴하도록 해야 사용가능하다. (PHP, Python 등에서)

혹은 정적인 html 페이지에서 <meta> 태그를 활용할 수도 있다. 아래는 예제 코드

<meta http-equiv="Content-Security-Policy"
      content="default-src 'self'; img-src https://*; child-src 'none';">

<CSP 의 Goal 두 가지>

1. 실행가능한 소스, 함수 등을 제한하여 외부의 XSS 방지

2. 외부 -> 웹페이지로 로드 되는 URL, Protocol 등을 제한하여 패킷 스니핑 공격 방지

<CSP 사용법>

usage

실제 사용사례

위 html <meta> 태그에서 보이듯이 content 값에 따라 무언가를 제한하고 허용한다.

content 값은 정책들이 모여있는 곳으로 각 정책은 ; 세미콜론으로 나뉜다.

안에 들어가는 항목을 보자 우선 처음에 default-src 가 들어가는 부분은 디렉티브(directive) 라고 부른다.

정책이 어떤 것을 제한하는지를 표시하는 존재라고 생각하면 된다.

만약 특정 스크립트에 대한 제한을 걸고 싶다면, default-src 또는 script-src 디렉티브를 쓰면 된다.

만약 특정 style 요소에 대한 제한을 걸고 싶다면, default-src 또는 style-src 디렉티브를 쓰면 된다.

이 밖에도 여러가지 디렉티브가 존재한다. 전체 디렉티브 정보 docs

대표적으로 쓸만한 디렉티브만 정리해본다.

  • default-src : 다른 쓸만한 디렉티브가 없으면 기본적으로 사용해야하는 디렉티브이다. 여기에 덧대어 다른 추가적인 디렉티브 정책이 있으면 해당 디렉티브는 동작하지 않는다.
  • script-src : 자바스크립트에 대한 허용된 소스를 지정한다.
  • style-src : css, style 적인 요소에 대해 허용된 소스를 지정한다.
  • object-src : <object>, <embed>, <applet> 태그 요소에 대해 허용된 소스를 지정한다.
  • connect-src : script 의 src 로 불러올 수 있는 허용된 url 을 지정한다.(script-src-elem 이랑 비슷한 역할인 듯하다?)
  • base-uri : 문서요소에서 사용할 수 있는 허용된 uri 를 지정한다.
  • img-src : favicon 또는 이미지 요소에 대해 허용된 것을 지정한다.

디렉티브를 넣었으면 그 다음 디렉티브에 대한 value 를 지정해야한다.

value 도 정리해본다.

  • none : 페이지에 어떤 리소스도 허용시키지 않는다. 원천차단.
  • self : 현재 origin 으로 부터의 리소스만 허용한다.
  • unsafe-eval : eval() 같이 안전하지 않은 함수를 허용한다.
  • unsafe-inline : nonce 나 hash 가 정해지지 않은 javascript:, <script>, URL 등의 구문을 허용한다.
  • <host 구문> : example.com, *.example.com, https://example.com:12073/path/file.js 같은 호스트를 허용한다.
  • <scheme 구문> : https:, data:, http: 같은 스키마 허용
  • <sha*-* 구문> : sha256-일련의 해시값, sha512-일련의 해시값 으로 특정 함수나 호스트를 허용한다.
  • <nonce-암호화된문자열 구문> : 특정 inline 스크립트를 허용한다. 암호화가 안된 일반 문자열도 된다고 함.

결론적으로 Response 헤더의 CSP 항목에 (디렉티브) (value); (또 다른 디렉티브) (value); 를 지정하여 CSP 를 허용할 수 있다.

임의로 조정하는 문제도 있으니 잘 알아두자.

반응형

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

WASM(Web Assembly) 정리  (2) 2021.08.31
DreamHack CTF 문제에서 배우는 NOSQL Injection  (0) 2020.09.30
동적 폼(form) 만들기  (0) 2018.07.24