CSP 관련 워게임을 풀다가 리마인드 하게된 내용이 있어 복습겸 다시 적어봅니다.

CSP(Content Security Policy) - default-src

CSP(Content Security Policy)란 페이지에서 데이터를 로드하거나 동작이 수행될 때, 어떤 출처를 허용할지 선언하는 HTTP 헤더입니다.

그 중에서도 default-src 지시어에 대한 내용을 다뤄보겠습니다.

 

CSP에는 다양한 지시어가 있습니다.

<script> 태그나 인라인 이벤트 핸들러, eval()를 담당하는 script-src 

<img> 태그와 CSS 이미지 쪽을 담당하는 img-src

<style> 태그 등을 담당하는 style-src 등등 지시어가 있으며 

그 중 default-src 지시어는 위와 같은 명시되지 않은 리소스 지시어의 기본값을 담당합니다.

즉, 명시하지 않은 리소스 지시어들의 값은 default-src 지시어의 값으로 통일되는 형식입니다.

대부분의 지시어는 리소스 지시어에 포함되어있고 그렇기에 default-src를 명시하면 보통 적지 않은 대부분의 보안 설정이 되는 것 같은 느낌이 들지만.. 막히지 않은 부분이 있습니다.

바로 navigate 계열입니다.

base-uri나 sandbox같은 문서나 기타 계열이 있지만 다루진 않겠습니다.

default-src 'self'와 네비게이션

default-src 'self' 의 뜻은 다른 리소스 지시어들이 명시되지 않았을 때, 그 기본 값을 self로 한다는 뜻입니다.

또한 self의 경우 현재 페이지와 같은 출처만 허용한다는 뜻이고요.

즉 프로토콜, 도메인, 포츠가 모두 현재 페이지와 같아야만 허용하게됩니다.

 

default-src는 fetch 계열 지시어들을 포함합니다.

fetch 계열이란 현재 문서는 그대로 있고, 외부에서 무언가를 가져오는 동작들을 뜻합니다.

브라우저가 현재 문서를 유지한 채로 백그라운드에서 HTTP요청을 보내고 받아오는 과정입니다.

예로 fetch()함수나 <img>태그 처럼 문서에 무언가를 불러오는 동작을 뜻합니다.

 

반대로 네비게이션 계열은 현재 문서 자체가 다른 URL로 이동하는 동작을 뜻합니다.

브라우저를 쓰면서 현재 창의 URL이 바뀌는 동작들이 네비게이션 동작입니다.

default-src의 경우 이 네비게이션 계열의 CSP를 포함하지 않기에 우회가 가능합니다.

문제에서의 활용

풀던 문제의 CSP 설정은 다음과 같았습니다.

    csp = f"default-src 'self'; " \
          f"script-src 'self' 'nonce-{nonce}' 'unsafe-inline'; " \
          f"img-src 'self'; " \
          f"style-src 'self'; " \
          f"object-src 'none'; " \
          f"base-uri 'none';"

 

문제 풀이 과정에서 nonce를 획득하여 XSS가 가능했고, 이를 통해 쿠키로 세션값을 탈취하여 플래그를 구하는 과정이었습니다.

이때 XSS 페이로드에 fetch() 함수를 사용하여 외부로 쿠키를 받아오려했지만 실패하였고, location 객체를 활용했을 땐 성공하였습니다.

 

fetch()함수의 경우 connect-src 지시어의 관할입니다.
위 코드에서 connect-src는 명시되지 않았기에 default-src의 값으로 대신하고, 이 값이 self이므로 외부의 URL이 필터에 걸려 작동하지 않은 것입니다.

 

이에 반해 location 객체는 네비게이션 지시어 관할입니다.

위 코드에서는 navigate-to 관련 지시어가 명시되지 않았기에 네비게이션 관련 필터가 없는 상태입니다.

이 때문에 location 객체를 통해 외부 페이지로 이동되는게 막히지 않았고, 이를 활용하여 세션 쿠키를 획득 할 수 있었습니다.

 

네비게이션 지시어를 설정하고자 한다면 navigate-to 지시어의 값을 조정하면됩니다.

예를들어 self로 지정할 경우 위에서 설명한 것 처럼 같은 출처의 네비게이션 이동만 허용하고, none의 경우 모든 네비게이션 이동을 막게됩니다.

위와 같은 설정을 해두었다면 아마 location 객체 역시 동작하지 않았을 것입니다.

 

 

 

문제를 풀다보니 CSP에 대해서 잘 모르고 있던 사실을 알게되어 글을 적어보네요.

자주 보던 리소스 지시어를 복습하는 시간 겸, 익숙하지 않았던 네비게이션 지시어를 공부하는 문제였습니다.

패치와 네비게이션의 차이를 다시 한 번 되짚어보고 기초를 더 다지게 되는 시간이었네요.

 

'보안 > 이론 정리' 카테고리의 다른 글

API - GraphQL  (0) 2026.03.05
웹 해킹 - SQLi UNION에 대하여  (0) 2026.02.11
웹 해킹 - PHP output buffer overflow  (0) 2025.12.04
웹 해킹 - XSS Filter Bypass  (0) 2025.10.15
스프링부트 - URL 매핑과 컨트롤러  (0) 2025.10.03

+ Recent posts