본문 바로가기

Web 관련

CSP(Content-Security-Policy)와 CSP bypass

CSP

콘텐츠 보안 정책(Content Security Policy, CSP)은 신뢰된 웹 페이지 콘텍스트에서

악의적인 콘텐츠를 실행하게 하는 사이트 간 스크립팅(XSS), 클릭재킹,

그리고 기타 코드 인젝션 공격을 예방하기 위해 도입된 컴퓨터 보안 표준

 

출처: https://ko.wikipedia.org/wiki/%EC%BD%98%ED%85%90%EC%B8%A0_%EB%B3%B4%EC%95%88_%EC%A0%95%EC%B1%85

 

콘텐츠 보안 정책 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 콘텐츠 보안 정책(Content Security Policy, CSP)은 신뢰된 웹 페이지 콘텍스트에서 악의적인 콘텐츠를 실행하게 하는 사이트 간 스크립팅(XSS), 클릭재킹, 그리고 기타 코드 인젝션 공격을 예방하기 위해 도입된 컴퓨터 보안 표준이다.[1] 웹 애플리케이션 보안의 W3C 워킹 그룹의 후보 권고안이며[2] 현대의 웹 브라우저에 폭넓게 지원된다.[3] CSP는 웹사이트 소유자들이 승인된 콘텐츠 오리진(ori

ko.wikipedia.org

 

Response Header를 통해 어떤 룰을 적용할 것인지 설정 할 수 있고, 예시는 아래와 같음

 

Content-Security-Policy: default-src 'self'; script-src 'self' 'ar9ang3.com' 'unsafe-inline'

 

정책 디렉티브는 지시어 종류(예. default-src, script-src)와

1개 이상의 출처(예. 'self', https:, *.example.com)가 스페이스로 분리된 형태로 지정

 

CSP에서 기본적으로 사용할 수 있는 Origin 명세

<host-source> 호스트와 포트로 판별 https://*.example.com
example.com:443
http://test.example.com
<scheme-source> URL 스키마로 판별 http:, https:, data:, blob:, ...
'self' 같은 Origin의 자원만 허용 'self'
'unsafe-eval' eval() 등 안전하지 않은 함수를 허용 'unsafe-eval'
'unsafe-inline' 유효한 nonce나 해쉬가 지정되지
않은 
<script>, javascript: URL 등을 허용
'unsafe-inline'
'none' 어떤 Origin도 허용하지 않음 'none'
nonce-<base64> ase64로 지정된 nonce를 지정 'nonce-CAxn148fFUvd9u3201Gy='
<hashalg>-<base64> Base64로 지정된 해쉬 값을 사용하여
추후 로드되는 자원의 해쉬와 비교
sha384-OLBgp1GsljhM2TJ+sbHjaiH9txEUvgdDTAzHv2P24donTt6/529l+9Ua0vFImLlb3g==

위 헤더가 Response를 통해 Client Side로 전달되면 브라우저는 이를 해석

default-src는 DOM의 기본 객체(frame, script, style, img, base 등..)의 출처(resource)를 모두 설정하는 내용입니다.

script-src는 위 default-src에서 일괄적으로 설정한것이 아닌 script tag의 출처만을 설정하는 내용

설정 값 중 self는 자기 자신의 도메인만을 신뢰한다는 뜻이고, example.com 등 특정 도메인을 지정 가능

script-src 가 ‘none’으로 설정되어 있을 경우 그 어느 스크립트도 해당 DOM에서 실행되지 못합

unsafe-inline은 DOM에서 일어나는 inline script를 허용

따라서 위와같이 Content-Security-Policy가 적용되어 있을 경우

 

 

 

 와 같은 태그는 출처가 CSP를 통과하지 못하여 로드하지 않게 됨

 

<script nonce="1AfdcQ8/gY+d1Yarc7=="> 와 같이 특정 nonce 속성이 입력된 태그만을 허용하며,

추가로 <base> 태그가 현재 페이지가 참조하는 상대 경로들이 해석되는 기준점을 바꾸지 못하도록 함

 nonce 값은 공격자가 예측할 수 없도록 페이지를 접근할 때마다 재생성하여야 함

Content-Security-Policy:  default-src 'nonce-1AfdcQ8/gY+d1Yarc7==';  base-uri 'none'

 

다음은 SHA384 해쉬가 38b060a751ac9638...4898b95b 인 스크립트를 허용하는 CSP 헤더

Content-Security-Policy: script-src 'sha384-OLBgp1GsljhM2TJ+sbHjaiH9txEUvgdDTAzHv2P24donTt6/529l+9Ua0vFImLlb3g=='

 

출처: https://defenit.kr/2020/02/11/Web/%E3%84%B4%20Research/CSP-Bypass-Tips/

 

CSP Bypass Tips

이번에 개인적으로 CSP(Content Security Policy)를 우회해야 할 일이 있었어서 관련 자료를 조사하여 해당 내용 공유드릴까 합니다. CSP는 Server Side에서 Client Side의 보안을 설정하여 줄 수 있는 기능입니다. Response Header를 통해 어떤 룰을 적용할 것인지 설정 할 수 있고, 예시는 아래와 같습니다. 1C

defenit.kr

 

 

CSP Bypass

신뢰하는 도메인에 파일 업로드

만약 해당 웹 사이트가 파일 업로드 및 다운로드 기능을 제공한다면,

공격자는 해당 사이트에 스크립트 등을 업로드한 뒤

다운로드 주소로 대상 웹 페이지에 해당 자원을 포함시킬 수 있음

<script src="/download_file.php?id=177742"></script>

 

nonce 예측 가능

nonce를 사용할 때에는 nonce 값을 담고 있는

HTTP 헤더 또는 <meta> 태그가 캐시되지 않는지 주의

 PHP나 CGI 계열 스크립팅을 사용할 때에는 특히 주의하여야 하는데,

이는 스크립트들이 마치 디렉토리처럼 /index.php/style.css 와 같이

뒤에 추가적인 경로를 붙여 접근될 수 있기 때문

만약 캐시 서버가 확장자를 기반으로 캐시 여부를 판단한다면

 .css 는 일반적으로 정적 파일이므로 동적 콘텐츠로 간주하지 않아 캐시에 저장할 수 있고,

이 경우 캐시가 만료될 때까지 요청시마다 같은 nonce가 돌아오기 때문에

공격자는 이를 바탕으로 nonce를 획득

콘텐츠가 캐시되어 서버측 XSS가 일어나지는 않으나,

DOM XSS 등 클라이언트측에서 일어날 수 있는 공격에 취약

 

base-uri 미지정

HTML에서 하이퍼링크에서 상대 경로를 지정하면

브라우저는 마치 파일 경로처럼 기본적으로 현재 문서를 기준으로 주소를 해석

HTML <base> 요소는 상대 경로가 해석되는 기준점을 변경할 수 있도록 하며

<a>, <form> 등의 target 속성의 기본값을 지정

만일 공격자가 와 같은 마크업을 삽입하게 된다면

추후 상대 경로를 사용하는 URL들은 본래 의도한 위치가 아닌

공격자의 서버에 자원을 가리키게 되어 공격자는 이를 통해 임의의 스크립트 등을 삽입가능

본래 <base> 태그의 href 속성을 사용하지 않는 페이지라면

이를 방어하기 위해 다음과 같은 정책을 설정

Content-Security-Policy: base-uri 'none';

'Web 관련' 카테고리의 다른 글

WSGI, WAS, CGI  (0) 2020.06.03
CGI (Common Gateway Interface)  (0) 2020.05.24
SOP(Same Origin Policy)  (0) 2020.05.13
Web server and Web application  (0) 2020.05.13
URI URL  (0) 2020.04.29