드림핵 Web Hacking-11일차

지선·2023년 8월 23일

드림핵WebHacking

목록 보기
12/12

CSP (Content Security Policy)

페이지의 컨텐츠에서 사용하는 자원들이 모두 웹 서버에서 의도한 자원이 맞는지 확인하는 용도로 사용
XSS나 데이터를 삽입하는 류의 공격이 발생했을 때, 피해를 줄이고 웹 관리자가 공격 시도를 보고 받을 수 있도록 새롭게 추가된 보안 계층

XSS 공격은 브라우저가 서버로부터 전달받은 컨텐츠를 신뢰한다는 점을 이용->공격자에 의해 추가된 악성 컨텐츠도 믿음->CSP가 이를 방지하기 위해 웹 페이지에 사용될 수 있는 자원의 위치, 출처 등에 제약을 검

CSP 헤더: 1개 이상의 정책 지시문이 세미콜론으로 분리된 형태
정책 지시문은 지시문과 1개 이사의 출처가 공백으로 분리된 형태
지시문 : default-src, script-src 등
출처: 'self', https:, *.dreamhack.io 등
ex) default-src 'self' https://example.dreamhack.io
일반적으로 Content-Security-Policy HTTP 헤더에 추가하여 적용
ex) Content-Security-Policy: <policy-directive>; <policy-directive>
페이지 내부의 자원들이 같은 오리진이나 https://~에서만 로드되어야 함을 알려주는
ex) Content-Security-Policy: default-src 'self' https://~
헤더 외에 메타 태그의 엘리먼트로도 정의 가능
ex)<meta http-equiv="Content-Security-Policy" content="default-src 'self' https://example.dreamhack.io">
CSP Evaluator를 통해 작성한 CSP가 안전한지 검사 가능

CSP 기본정책 Inline Code

CSP가 Inline Code를 유해하다고 간주 -> CSP 에서 Inline Code 사용 불가
Inline Code: src 속성으로 코드를 로드하지 않고 태그 내에 직접 코드를 삽입하는 것
ex)

<script>alert(1);</script>

script 태그 내에 코드를 직접 삽입 했기에 Inline Code

<script src="alert.js"></script> 와 같이 src 속성에 코드 경로 정의하는 방식 권장

script 태그 내 코드 삽입, on 이벤트 핸들러 속성(onerror, onfocus 등), javascript: url 스키마, CSS 스타일시트를 Inline Code로 간주

CSP 기본정책 Eval

문자열 텍스트를 실행 가능한 자바스크립트 코드 형태로 변환하는 메커니즘을 유해하다고 간주
eval, new Function(), setTimeout([string], ...), setInterval([string], ...)
: 문자열 형태로 입력 받는 함수
단, 문자열 입력이 아닌 인라인 함수형태로 파라미터가 전달되는 경우 차단 x

차단
setTimeout("alert(1)", ...)
허용
setTimeout(function(){alert(1)}, ...)

Policy Directive

<policy Directive>는 <directive>와 <value>로 구성
<directive>: 지시문, 컨텐츠 내에서 로드하는 리소스 세분화->어떤 리소스에 대한 출처를 제어할지 결정
<value>: 정의한 리소스의 출처 정의, 여러개의 출처 정의 가능(공백 통해 구분)

지시문 종류

  • default-src:-src로 끝나는 모든 지시문의 기본 동작 제어, 지정하지 않은 지시문
  • img-src: 이미지 로드할 수 있는 출처 제어
  • script-src:스크립트 태그 관련 권한, 출처를 제어
  • style-src:스타일시트 관련 권한, 출처를 제어
  • child-src:페이지 내에 삽입된 프레임 컨텐츠에 대한 출처 제어
  • base-uri:페이지의 <base> 태그에 나타날 수 있는 URL을 제어

출처 종류

(서브도메인: https://hello.example.com의 hello)

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

CSP Examples

  • Content-Security-Policy: default-src 'self'
    모든 리소스의 출처를 현재 페이지와 같은 출처로 제한
  • Content-Security-Policy: default-src 'self' https://googleapis.com https://*.googleapis.com
    모든 리소스의 출처를 현재 페이지와, https://~~로 제한
  • Content-Security-Policy: default-src 'self'; img-src *; script-src static.dreamhack.io
    모든 리소스의 출처를 현재 페이지와 같은 출처로 제한, 이미지의 출처는 모든 호스트 허용, 스크립트 태그는 static.dreamhack.io로 제한
  • Content-Security-Policy: child-src 'self' frame.dreamhack.io
    페이지 내 삽입된 프레임 컨텐츠의 URL은 frame.dreamhack.io내의 컨텐츠만 로드 가능
  • Content-Security-Policy: base-uri 'none'
    base 태그의 url은 어느것도 허용 x
  • Content-Security-Policy: script-src 'unsafe-eval'
    자바스크립트 코드 내에 eval과 같은 텍스트-자바스크립트 변환 메커니즘 사용 허용
  • Content-Security-Policy: script-src 'unsafe-inline'
    스크립트 코드 내에 inline code 사용 허용
  • Content-Security-Policy: script-src ‘nonce-YTQyYWZkODYtYWYyNy00ZGQzLTg2YjMtNzJhY2ZmOWY5OGNj'
    스크립트 태그의 nonce 속성에 YT~~값이 존재하지 않으면 스크립트 로드 실패
  • Content-Security-Policy: script-src 'sha256-5jFwrAK0UV47oFbVg/iCCBbxD8X1w+QvoOUepu4C2YA='
    스크립트 태그 내의 코드나 src 속성으로 지정된 파일의 sha256해시를 base64로 인코딩한 결과가 5j~가 아니면 스크립트 로드 실패
profile
긍정왕되기

0개의 댓글