hogbal 2022. 12. 6. 11:50

CSP는 Content Security Policy의 약자로 XSS 공격 기법이나 데이터를 삽입하는 기법을 막기위해 추가된 보안 기법이다. CSP를 사용하면 웹페이지 내에 있는 모든 자원들이 제한된 곳에서만 로드되어야 하도록 설정할 수 있다.

CSP 기본 정책

우선 CSP의 기본정책에는 여러 종류가 있다.

Inline Code

CSP는 인라인 코드 (Inline Code)를 유해하다고 간주한다. 따라서 CSP를 사용할 때에는 기본적으로 인라인 코드가 사용이 불가능하다.

인라인 코드란 <script>alert(1);</script> 와 같은 태그 내에 코드를 실행하는 것을 말한다.

또한, on* 이벤트 핸들러 속성, javascript: URL 스킴 또한 인라인 코드로 간주하고 허용하지 않는다.

CSP에서는 script src="alert.js"></script>와 같은 src속성을 이용해 정의하는 방식을 권장한다.

Eval

CSP는 기본적으로 문자열 텍스트를 실행 가능한 자바스크립트 코드 형태로 변환하는 메커니즘 또한 유해하다고 간주해 eval과 같은 함수를 막는다. 해당 함수에 문자열 입력이 아닌 인라인 함수 형태로 파라미터가 전달 될 때에는 차단되지 않는다.

CSP

CSP로 설정할 수 있는 지시문은 아래와 같다.

지시문 설명
default-src -src로 끝나는 모든 리소스의 기본 동작을 제어한다. 만약 CSP 구문 내에서 지정하지 않은 지시문이 존재한다면 default-src의 정의를 따라간다
img-src 스크립트 태그 관련 권한과 출처를 제어한다.
script-src 스크립트 태그 관련 권한과 출처를 제어한다.
base-uri 페이지의 <base> 태그에 나타날 수 있는 URL을 제어한다.

 

지시문의 값에 해당하는 출처의 종류는 아래와 같다.

출처 설명
도메인주소 와일드카드를 이용해 표현할 수 있다.
none 모든 출처를 허용하지 않는다.
self 페이지의 현재 출처 (Origin) 내에서 로드하는 리소스만 허용한다.
unsafe-inline 예외적으로 인라인 코드의 사용을 허용한다.
unsafe-eval 예외적으로 eval과 같은 텍스트-자바스크립트 변환 메커니즘의 사용을 허용한다.
nonce nonce 속성을 설정하여 예외적으로 인라인 코드를 사용한다. <base64-value> 는 반드시 요청마다 다른 난수 값으로 설정해야 한다. 해당 출처를 설정하면 unsafe-inline 은 무시된다.

 

CSP bypass

CSP를 우회할 수 있는 방법은 다양하다. 일단 wargame을 풀다가 알게된 하나의 방법을 소개하겠다.

우선 위에서 언급한 base-uri 지시문이 설정이 안되있을때 <base href="개인주소">로 설정해서 우회할 수 있다.