티스토리 뷰
반응형
CSP?
Content-Security-Policy의 약자로,
XSS 공격이 발생했을 때 그 피해를 줄이고 공격시도를 보고받을 수 있다.
공격자가 Web 사이트에 허용되지 않은 Script를 삽입하거나 공격자의 외부 페이지(Server)에
HTTP Request를 보내는 것을 막을 수 있도록 Response Header에 추가하는 정책이다.
만약 페이지가 PHP나 Python, CGI 등 동적 기능을 사용하지 않는 정적인 웹 페이지라면 CSP 정책을 HTML <meta> 태그로도 지정할 수 있습니다. 이는 바뀌지 않는 자원들을 별도의 HTTP 서버 설정 없이 HTML 페이지 내에서 지정할 수 있도록 합니다.
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; base-uri 'none'">
<host-source> | 호스트와 포트번호로 허용여부를 결정한다. (ex: *.dreamhack.io:443) |
<scheme-source> | URL scheme로 허용여부를 결정한다. (ex: http:, data: ...) |
'self' | 같은 Origin에 있는 자원만 허용한다. |
'unsafe-eval' | eval() 등의 안전하지 않은 함수를 허용한다. |
'unsafe-inline' | 유효한 nonce나 Hash가 정해지지 않은 <script>, javascript:, URL 등을 허용한다. |
'none' | 어떤 Origin도 허용하지 않는다. |
nonce-________________ | 문자열로 지정된 nonce가 지정된 것만 허용한다. (자료에선 Base64라는데 그냥 문자열도되는듯) |
<hashalg>-<base64> | Base64로 지정된 해쉬값을 사용해서 추후 로드되는 자원에 해쉬와 비교해 동일하면 허용한다. (개발자도구 Console의 Log로 확인이 가능하다. - 막혔을 경우 해쉬값이 뜬다.) nonce가 있어도 이 부분을 CSP로 정책으로 추가하면 허용이 가능하다. |
위와 같은 출처들을 아래 디렉티브에 적용해 CSP 정책을 완성 시키게 된다. 다양한 종류의 디렉티브가 존재하지만 대표적인 것만 살펴보면 아래와 같다. 여러 디렉티브에 대한 정책을 설정하기 위해서는 세미콜론(;)로 구분해 설정하면 된다.
default-src | 다른 디렉티브가 없을 때 사용되는 디렉티브이다. 추가적으로 다른 디렉티브에 대한 정책이 설정되면 동작하지 않는다. |
script-src | Javascript에 대한 검증된 출처를 지정하기 위해 사용된다. |
base-uri | 문서의 요소에서 사용할 수 있는 URL을 정의한다. 해당 값이 정의되지 않으면 모든 URI를 사용할 수 있다. |
img-src | 유효한 image와 favicons를 검증하기 위해 사용된다. |
더 다양한 디렉티브 등 CSP에 대한 정보는 아래 사이트에서 확인할 수 있다.
developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/base-uri
nonce값은 공격자가 예측할 수 없도록 페이지 접근시마다 재생성 해야 한다.
nonce값을 예측할 수 있다면 공격자가 원하는 Script를 추가해 동작할 수 있기 때문이다. HTTP Header 또는 <meta> 태그에 nonce값이 Cashing 될 경우 공격자가 이를 파악해 공격에 사용할 수 있다.
또한 base-uri를 미지정하는 것은 위험하다. 이유는................................................................................
반드시 base-uri none; 을 추가해주도록 하자!
CSP 정책에 의해서 사용할 수 없는 Script가 있다면 위와같이 개발자도구 Console에 에러가 나오게되고 보는바와 같이 해쉬값이 뿌려지게 된다. 이걸 임의로 CSP에 넣을 수 있다면...? 공격가능!
반응형
'Web > Concept' 카테고리의 다른 글
[Concept] SQL Injection (feat. dreamhack) (0) | 2020.09.21 |
---|---|
[Concept] CSRF (feat. dreamhack) (0) | 2020.09.17 |
[Concept] XSS (feat. dreamhack) (0) | 2020.09.17 |
[Concept] Tunneling (0) | 2019.09.16 |
[Concept] Port Forwarding (0) | 2019.09.16 |