본문 바로가기

Security

[Webhacking] [client-side advanced] CSP

반응형

CSP (content security policy) 는 XSS 공격이 발생했을 때 그 피해를 줄이고 웹 관리자가 공격 시도를 보고받을 수 있도록 하는 기술.

웹 페이지에서 사용될 수 있는 자원이나 위치 등에 제약을 걸어 공격자가 웹 사이트에 본래 있지 않던 스크립트를 삽입하거나 공격자에게 권한이 있는 서버 등에 요청을 보내지 못하도록 막을 수 있음.

XSS의 공격 피해를 완전히 무력화 시키는 방법은 아님

CSP 헤더는 1개 이상의 정책 디렉티브(지령)가 세미콜론 ; 으로 분리된 형태로 이루어져있음.

정책 디렉티브는

  • 지시어 종류 (default-src , script-src)
  • 1개 이상의 출처 ('self', https: , *~~.~~) 가 스페이스 형태로 구분 

 

페이지 내부의 자원들이 같은 Origin 또는 https://example.dreamhack.io 에서만 로드되어야 함을 나타내는 CSP 헤더

Content-Security-Policy: default-src 'self' https://example.dreamhack.io

 

특정 nonce 속성이 입력된 태그만을 허용,

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

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

이렇게 nonce 값이 지정되어 있어야 함. nonce는 js등으로 매 페이지 로드 시 새로 생성하게 해서 적용해야함.

base 태그는 베이스가 되는 url을 고칠 수 있음.

<base href="/images/" target="_blank" />

 

만약 python이나 php 같이 동적 기능 지원하지 않는 정적페이지라면 meta 태그로 지정가능

<meta http-equiv="Content-Security-Policy" content="default-src 'self'; base-uri 'none'">

 


CSP 우회 - 신뢰하는 도메인에 업로드 

CSP 이용시에 브라우저가 특정 웹 사이트에서만 자원을 불러오게끔 제한할 수 있음.

다운로드나 파일 업로드 기능 제공 시에 스크립트 업로드 후 다운로드 주소로 해당자원 포함 가능.

<meta http-equiv="Content-Security-Policy" content="script-src 'self'">
...
<h1>검색 결과: <script src="/download_file.php?id=177742"></script></h1>

 

JSONP API 신뢰 도메인에 존재 시에 가능한 공격

<script src="/v1/shares/1?type=jsonp&callback=alert(document.cookie);//"></script>
<!--
Response -> alert(document.cookie);//("status":200,"result":{"id":1,"shared_type":"post","title":"다람쥐 헌 쳇바퀴에 타고파"},"message":"요청에 성공하였습니다.");
주석처리에 의해 실제 실행되는 코드 -> alert(document.cookie); 
-->

JSONP는 외부 스크립트를 Origin에서 실행 가능하게 하는데 callback 방식임. (응답 데이터를 origin callback 함수에서 다룸)

 

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

<host-source> 호스트와 포트로 판별합니다. https://*.dreamhack.io
dreamhack.io:443
http://insecure.dreamhack.io
<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> Base64로 지정된 nonce를 지정합니다. 'nonce-CAxn148fFUvd9u3201Gy='
<hashalg>-<base64> Base64로 지정된 해쉬 값을 사용하여 추후 로드되는 자원의 해쉬와 비교합니다. sha384-OLBgp1GsljhM2TJ+sbHjaiH9txEUvgdDTAzHv2P24donTt6/529l+9Ua0vFImLlb3g==

CSP 우회 - nonce 예측 가능

nonce는 매번 요청마다 새로 생성하는데 알고리즘이 취약하여 예측되어지면 자신의 스크립트 삽입 가능.

HTTP 헤더 또는 <meta> 태그가 캐시되지 않는지 주의하여야 함.

만약 캐시서버가 확장자를 기반으로 캐시 여부 판단한다면 .css는 일반적으로 정적 파일이므로 동적 콘텐츠로 간주하지 않아 캐시에 저장할 수 있음.

(캐시 서버는 빠른 속도를 목적으로 사용자와 가까운 곳에 데이터를 임시 저장해 놓는 서버)

캐시 서버에 .css가 저장된 경우 이를 다시 요청한다면 캐시가 만료될 때 까지 같은 nonce가 돌아오기 때문에 공격자는 이를 통해 nonce 유추가능.

nonce는 예측 불가능한 난수 값이어야 하므로 안전한 난수생성기 (CSPRNG) 사용하는 것이 좋음.

현재 시각  (srand() / rand()) 공격자가 알 수 있는 정보 바탕으로 nonce 생성 시 방어 효과 잃는다.


CSP 우회 - base-uri 미지정

HTML에서 하이퍼링크에서 상대 경로를 지정하면 브라우저는 마치 파일 경로처럼 기본적으로 현재 문서를 기준으로 주소를 해석하게 됨.

만약 공격자가

<base href="https://malice.test/xss-proxy/">

를 심게되면 상대 경로 참조하는 URL은 의도한 위치가 아닌 공격자의 서버 자원을 가르킴.

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

심어야 함.

외부 링크이면 필터링을 통해 내부 링크로 넘겨서 경고를 보여주는 로직이 있는경우에도

base를 통해 url을 바꿔버리면 우회 가능

 

반응형

'Security' 카테고리의 다른 글

[Webhacking] [client-side advanced] CORS  (0) 2021.10.24
[Webhacking] [client-side advanced] CSRF  (0) 2021.10.24
[Webhacking] [client-side advanced] XSS  (1) 2021.10.05
[wargame] pathtraversal  (0) 2021.10.04
[wargame] devtools-sources  (0) 2021.10.04