본문 바로가기

해킹-보안

CSP(Content-Security-Policy)

반응형

CSP 개요

 
  • Mozilla가 개발한 표준으로 XSS, Data Injection, Click Jacking 등의 공격을 방지하기 위한 컨텐츠 기반 보안 정책
  • SOP(Same Origin Policy)와 비슷하지만 CSP는 웹 사이트 관리자가 규칙 적용
  • 웹 서버는 웹 사이트에서 사용 가능한 CSP 헤더를 브라우저에게 전달, 브라우저는 이를 기반으로 웹 페이지 렌더링
  • 인라인 자바스크립트(태그 내에 자바스크립트 명령어 작성) 실행 금지 설정 가능
  • 특정 웹사이트(origin)에서만 자원을 불러오도록 설정하여 공격자 서버에 요청을 차단
  • 공격자가 웹 사이트에 본래 존재하지 않던 스크립트 삽입하는 것을 방지
  • CSP 보안 정책을 정의한 상태에서 공격자가 다른 소스의 스크립트를 로딩 시 에러 출력


CSP 사용 헤더

 
  • Content-Secuirty-Policy : W3C가 지정한 표준 헤더 - 주로 사용
  • X-Content-Secuirty-Policy : FireFox/IE 구형 브라우저에서 사용되는 헤더
  • X-WebKit-CSP : 크롬 기반 구형 브라우저에서 사용되는 헤더


CSP 지시문 및 옵션

 

지시문
  • default-src : 모든 리소스에 대한 정책
  • script-src : Javascript 등 웹에서 실행 가능한 스크립트에 대한 정책
  • style-src : css에 대한 정책
  • connect-src : script src로 불러올 수 있는 url에 대한 정책
  • img-src : 이미지 ( data: URL에서 이미지가 로드되는 것을 허용하려면 data:를 지정 )
  • script-nonce : script-src에 nonce가 포함되는 정책
  • form-action : form 태그 내 action 부분에 대한 정책
  • object-src : 플러그인, 오브젝트에 대한 정책
  • media-src : video, audio
  • font-src : font
  • sandbox : HTML 샌드박스
  • reflected-xss : X-XSS-Protection header와 동일한 효과
  • report-uri : 정책 위반 케이스가 나타났을 때 내용을 전달할 URL
  • base-uri: <base> 요소에 나타날 수 있는 URL을 제한

옵션(src)
  • * : 모든 것을 허용
  • 'none' : 모두 차단
  • 'self' : 현재 도메인만 허용
  • 'unsafe-inline' : 소스코드 내 인라인 자바스크립트 및 CSS 허용
  • 'unsafe-eval' : eval 같은 텍스트-자바스크립트 메커니즘 허용

예시
  • 하위 도메인 리소스만 사용
 Content-Security-Policy: default-src 'self'
  • 특정 도메인만 신뢰
 Content-Security-Policy: default-src 'self' *.mydomain.com
  • 특정 태그만 허용
 Content-Security-Policy: default-src 'self' *.mailsite.com; img-src *
  • 특정 도메인만 무조건 SSL 통신
 Content-Security-Policy: default-src https://onlinebanking.jumbobank.com

 


CSP 사용 사례

 

외부 자바스크립트 로드 및 인라인 스크립트 실행 차단
 Content-Security-Policy: script-src https://example.com/
 // 아래 스크립트는 모두 실행 차단됨
 <script src="https://not-example.com/js/library.js"></script>
 <button id="btn" onclick="doSomething()">
 
 // 이벤트 핸들러(addEventListener)로 대체 사용
 document.getElementById("btn").addEventListener('click', doSomething);


인라인 스크립트 허용 방법
  • unsafe-inline
  • nonce-source
    - nonce는 암호 함수로 생성된 임의의 문자열
    - 특정 nonce 속성이 입력된 태그만 실행 허용(script 태그에 동일한 nonce를 설정해야 사용 가능)
    - 공격자는 서버에서 생성된 nonce를 획득하거나 예측 불가
    - nonce 값은 공격자가 예측할 수 없도록 페이지를 접근할 때마다 재생성,
      공격자가 nonce를 획득했다고 하더라도 재사용 공격 방지
  • 해시(SHA)
    - sha256, sha384, sha512 지원

예시
 // script 태그 허용
 Content-Security-Policy: script-src 'unsafe-inline';
 <!-- <script> var inline = 1; </script> 사용 가능 --!>
 
 // nonce-source를 이용한 인라인 스크립트 태그 허용
 Content-Security-Policy: script-src 'nonce-2726c7f26c'
 
 <!-- <script nonce="2726c7f26c"> var inline = 1; </script> --!>
 
 // 해시를 이용한 인라인 스크립트 태그 허용
 Content-Security-Policy: script-src 'sha256-B2yPHKaXnvFWtRChIbabYmUBFZdVfKKXHbWtWidDVF8='
 <!-- <script>var inline = 1;</script> -->



CSP 적용 방법


메타 태그
 <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'; style-src 'self'; ">

PHP Header 설정
 <?php
 $headerCSP = "Content-Security-Policy:".
              "default-src 'self';". // 기본은 자기 도메인만 허용
              "connect-src 'self' ;". // ajax url은 자기 도메인만 허용
              "script-src 'self' example.com code.jquery.com https://ssl.google-analytics.com ;". // 자기자신, 접근허용 도메인 설정
              "style-src 'self' 'unsafe-inline';".
              "report-uri https://example.com/csp_report.php;"; // 보안 정책 오류 레포트 URL 지정(meta 태그에선 사용불가)
 header($headerCSP);

nonce 설정
 <?php
 $nonce_key = hash('sha256', microtime());
 ?>
 
 //php로 헤더 설정 또는 meta tag에 삽입
 Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'
 
 <script nonce=EDNnf03nceIOfn39fn3e9h3sdfa>
    alert('해당 스크립트는 사용가능한 인라인 스크립트 입니다.');
 </script>
 
 <script>
    alert('해당 스크립트는 사용 불가능한 인라인 스크립트 입니다.');
 </script>



우회 방안

 
신뢰할 수 있는 도메인에 추가
  • CSP 헤더에 예외된 도메인을 확인 (cdn이나 파일을 업로드할 수 있는 도메인 등)
  • 해당 웹 사이트가 파일 업로드 및 다운로드 기능을 제공 할 경우,
    스크립트가 입력된 파일을 업로드 후 다운로드 주소로 해당 스크립트 파일을 가져와서 실행
  • 즉, CSP로 허용된 도메인에서 스크립트를 불러와 실행

예시
 GET /csp.php?q= HTTP/1.1
 Content-Security-Policy: default-src ‘self’ test1234.com
 // self 도메인인 test1234.com만 신뢰하는 csp
 // test1234.com의 csp.php 페이지는 다른 파일을 다운로드하는 역할
xss.txt 파일 업로드
 alert(1)
XSS Query
 http://test1234.com/test/csp.php?q=</script><script src="http://test1234.com/test/xss.txt"></script>
response
 <script></script><script src="http://test1234.com/test/xss.txt"></script>

Unsafe-inline, Unsafe-eval
  • 외부 리소스 사용에 제한이 존재하지만 인라인 자바스크립트를 허용하기 때문에 도메인과 별개로 로컬 스크립트로 우회가 가능

Static file을 이용한 우회
  • favicon.ico, robots.txt, sitemap.xml 등 웹에서 기본적으로 사용하는 일부 파일들은 CSP에 영향을 받지 않음
  • 위 파일에 script를 업로드 혹은 reflected가 가능한지 확인

base-uri 미지정
  • HTML에 <base> 요소를 사용하면 상대 경로를 지정 가능
  • a, form 등의 target 속성 기본값을 지정
  • 어떤 주소가 삽입되면 <base>로 지정해 준 주소를 기준으로 해석
  • 공격자는 <base href=”주소”>와 같은 마크업을 사용, 추후 상대경로를 사용하는 모든 URL은
    본래 의도한 위치가 아닌 공격자의 서버 자원을 가리키게 되어 이를 통해 임의의 스크립트 삽입 가능
  • base-uri 방어 정책 => Content-Security-Policy: base-uri 'none'


CSP 정책 수준을 진단하는 사이트
https://csp-evaluator.withgoogle.com/

참고
  • https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Content-Security-Policy
  • http://secuinside.com/archive/2017/2017-1-5.pdf
  • https://simjaejin.tistory.com/31
  • https://www.hahwul.com/2019/01/27/csp-bypass-technique-xss/#section_2
  • https://defenit.kr/2020/02/11/Web/%E3%84%B4%20Research/CSP-Bypass-Tips/
  • https://skogkatt.tistory.com/69
  • https://hackingisly.tistory.com/32
  • https://dreamhack.io/learn/1/18#20
반응형

'해킹-보안' 카테고리의 다른 글

Fiddler Customize Rules  (1) 2021.04.12
xss-game level6  (0) 2021.04.06
XSS CheatSheet  (3) 2021.03.11
구글 해킹(Google Dorks)  (0) 2021.02.28
XSS 화이트리스트 소스코드  (0) 2021.02.26