CIDY
[Web_Hacking] AD(client): stage3_Content Security Policy 본문
*CSP
Content Security Policy의 약자. 컨텐츠 보안 정책으로, XSS와 같이 의도치 않은 데이터를 삽입하는 형태의 공격을 방어하기 위한 보안 계층이다.
XSS공격은 브라우저가 서버로부터 전달받은 데이터를 신뢰한다는 것에 기반한다. CSP는 이와 같은 형태의 공격 방지를 위해 웹 페이지에 사용될 수 있는 자원의 위치와 출처에 제약을 건다.
CSP헤더는 여러 개의 정책 지시문이 ; 으로 분리된 형태이다. 정책 지시문은 default-src, script-src와 같은 지시문과 'self', https:, *.dreamhack.io와 같은 출처가 공백으로 분리된 형태여야 한다.
default-src 'self' https://example.dreamhack.io
위 CSP구문은 페이지 내부 자원이 오리진('self')이나, https://example.dreamhack.io에서만 로드되어야 함을 뜻한다.
Content-Security-Policy: <policy-directive>; <policy-directive>
위와 같은 CSP구문은 Content-Security-Policy HTTP헤더에 추가해 적용할 수 있다. 위 구문에서 policy-directive부분에 CDP를 정의하는 정책 디렉티브를 작성한다.
Content-Security-Policy: default-src 'self' https://example.dreamhack.io
처음 보여준 CSP구문을 HTTP헤더에 추가하면 위와 같이 되는 것. ↑
이외에도 meta태그의 element로 정의할 수 있다.
<meta http-equiv="Content-Security-Policy" content="default-src 'self' https://example.dreamhack.io">
meta태그로 정의하면 위와 같이 됨. ↑
(*CSP evaluator로 구문이 올바르게 정의되었는지 검사할 수 있다.)
*Inline Code
CSP는 인라인 코드를 유해하다고 간주한다. -> CSP를 이용할 경우 인라인 코드 사용 불가. (태그의 src속성으로 코드를 태그하지 않고, 태그 내에 직접 코드를 삽입하는 것을 인라인 코드라고 함)
<script>alert(1);</script> -> 스크립트 태그 내에 코드를 직접 넣음 -> 인라인
<script src="alert.js"></script> -> src속성에 코드 경로를 정의 -> 사용 가능
태그 내 코드 삽입 뿐만 아니라, on~ 이벤트 핸들러 속성, javascript: URL scheme도 인라인으로 간주 -> 허용 X
CSS스타일시트 역시 인라인 코드를 허용하지 않는다. style속성, style태그 모두 외부 스타일시트로 통합하도록 권장
*Eval
CSP는 문자열 텍스트를 실행 가능한 자바스크립트 코드로 변환하는 매커니즘을 유해하다고 간주함. -> eval, new Function(), setTimeout([string], ...), setInterval([string], ...)과 같이 문자열 형태의 입력을 받는 함수의 실행은 모두 차단된다.
eval과 같이 문자열로부터 코드를 실행하는 함수의 경우, XSS공격을 통해 삽입된 공격 코드로 변조되어 실행될 가능성이 있기 때문.
단, 위 함수에 문자열 입력이 아닌 인라인 함수 형태의 파라미터가 전달되는것은 허용됨.
setTimeout("alert(1)", ...) -> 차단
serTimeout(function(){alert(1)}, ...) -> 허용
*Policy Directive
<Policy-directive>는 <directive> <value>형태로 구성된다. <directive>는 지시문으로, 컨텐츠 내에서 로드하는 리소스를 세분화하여 어떤 리소스에 대한 출처를 제어할지 결정한다. <value>는 <directive>에서 정의한 리소스의 출처를 정의한다. (여러 개 출처 정의 가능, 띄어쓰기로 구분)
->지시문 종류
default-src | -src로 끝나는 모든 리소스의 기본 동작 제어. CSP구문 내에서 지정하지 않은 지시문이 있을 경우 default-src의 정의를 따름. |
img-src | 이미지를 로드할 수 있는 출처 제어. |
script-src | 스크립트 태그 관련 권한과 출처 제어. |
style-src | 스타일시트 관련 권한과 출처 제어. |
child-src | 페이지 내에 삽입된 프레임 컨텐츠에 대한 출처 제어. |
base-uri | 페이지의 <base> 태그에 나타날 수 있는 URL 제어. |
->출처 종류
*://example.com | 출처의 scheme은 와일드카드를 이용해 표현 가능. |
https://*.example.com | 출처의 호스트 서브도메인은 와일드카드를 이용해 표현 가능. 와일드카드는 호스트의 중간에 들어가지 못함. -> https://www.*.com, https://*.example.* 서브도메인을 와일드카드로 표현할 때 서브도메인이 붙어있지 않는 도메인은 포함되지 않음. -> https://*.example.com으로 출처를 표기할 경우, https://example.com은 포함 안됨 |
https://example.com:* | 출처의 포트는 와일드카드를 이용해 표현 가능. |
none | 모든 출처를 허용X. |
self | 페이지의 현재 출처 (Origin) 내에서 로드하는 리소스만 허용. |
unsafe-inline | 예외적으로 인라인 코드의 사용을 허용. |
unsafe-eval | 예외적으로 eval과 같은 텍스트-자바스크립트 변환 메커니즘의 사용을 허용. |
nonce-<base64-value> | nonce 속성을 설정하여 예외적으로 인라인 코드를 사용. <base64-value> 는 반드시 요청마다 다른 난수 값으로 설정해야 함. 해당 출처를 설정하면 unsafe-inline 은 무시된다. |
<hash-algorithm>-<base64-value> | script 혹은 style 태그 내 코드의 해시 표현. 해당 출처를 설정하면 unsafe-inline 은 무시된다. |
(*일반적으로 <value>에는 URL을 받는데, 와일드카드 이용, 특수한 목적의 출처도 있다.)
*CSP 예시
Content-Security-Policy: default-src 'self' -> 모든 리소스 출처를 오리진으로 제한
Content-Security-Policy: default-src 'self' https://orcinus-orca.tistory.com -> 모든 리소스 출처를 오리진 + https://orcinus-orca.tistory.com 으로 제한
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' -> 스크립트 태그 내 인라인 코드 사용 허용
Content-Security-Policy: script-src ‘nonce-YTQyYWZkODYtYWYyNy00ZGQzLTg2YjMtNzJhY2ZmOWY5OGNj' -> 스크립트 태그의 nonce속성에 YTQyYWZkODYtYWYyNy00ZGQzLTg2YjMtNzJhY2ZmOWY5OGNj값이 없으면 스크립트 로드 실패
Content-Security-Policy: script-src 'sha256-5jFwrAK0UV47oFbVg/iCCBbxD8X1w+QvoOUepu4C2YA=' -> 스크립트 태그 내 코드나 src속성으로 지정된 파일의 sha256해시를 base64로 인코딩한 결과가 5jFwrAK0UV47oFbVg/iCCBbxD8X1w+QvoOUepu4C2YA=와 다르면 스크립트 로드 실패
'Hack > DreamHack(로드맵)' 카테고리의 다른 글
[Web_Hacking] AD(client): stage2_문제풀이(XSS Filtering Bypass Advanced) (0) | 2022.07.31 |
---|---|
[Web_Hacking] AD(client): stage1_XSS Filtering Bypass-2 (0) | 2022.07.31 |
[Web_Hacking] AD(client): stage2_문제풀이(XSS Filtering Bypass) (0) | 2022.07.31 |
[Web_Hacking] AD(client): stage1_XSS Filtering Bypass-1 (0) | 2022.07.30 |
[Web_Hacking] stage10_문제풀이(blind-command) (0) | 2022.07.30 |