반응형
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://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 |