-
[SISS/웹해킹 스터디] 25-1학기 3주차 스터디 - Content Security Policy, Natas 12 >> 1425-1 SISS/웹해킹 2025. 3. 29. 08:00
[SISS/웹해킹 스터디] 25-1학기 3주차 스터디 - Content Security Policy, Natas 12 >> 14 : 3주차 (3/24 ~ 3/30) Content Security Policy 12 >> 14
수강 인증 화면 캡쳐 Content Security Policy
- 컨텐츠 보안 정책(CSP)
- XSS, 데이터 삽입 등의 공격으로부터 피해를 예방하기 위하여 추가된 보안 계층
- 자원의 위치, 출처 등에 제약을 걸 수 있음
- 구성
- 한 개 이상의 정책 지시문이 세미콜론(;)으로 분리
- 지시문과 출처가 공백으로 분리
- 예시 (하단 코드)
- 위치
- HTTP 헤더 이용
- meta 태그의 element
// 페이지 내부의 자원이 같은 오리진 혹은 example.dreamhack.io에서 로드되어야함을 나타냄 {{default-src 'self' https://example.dreamhack.io }} // HTTP 헤더를 이용한 양식 Content-Security-Policy: <policy-directive>; <policy-directive> // HTTP 헤더를 이용한 예시 Content-Security-Policy: default-src 'self' https://example.dreamhack.io // meta 태그의 element를 이용한 방식 <meta http-equiv="Content-Security-Policy" content="default-src 'self' https://example.dreamhack.io">
- CSP 기본 정책 - Inline Code
- 인라인 코드
- 태그의 src 속성으로 코드를 로드하는 것이 아닌 태그 내 직접 코드 삽입
- 비허용 코드 종류
- <script> 태그 내 코드 삽입
- on* 이벤트 핸들러 속성
- javascript: URL 스킴
- CSS 스타일 시트
- 예시
- 인라인 코드
// 인라인 코드 <script>alert(1);</script> // src 속성을 이용하여 코드 경로 정의 <script src="alert.js"></script>
- CSP 기본 정책 - Eval
- eval()
- 문자열로부터 코드를 실행 → XSS 공격의 위험 증가
- 비허용 함수 종류
- 문자열 형태로 입력 받는 함수의 실행은 모두 차단
- 인라인 함수 형태로 파라미터가 전달될 경우는 차단되지 않음
- eval(), new Function(), setTimeout(, …), setInterval(, …)
- 문자열 형태로 입력 받는 함수의 실행은 모두 차단
- 예시
- eval()
// CSP 정책에 의해 차단되는 경우 setTimeout("alert(1)", ...) // CSP와 관계 없이 허용되는 경우 setTimeout(function(){alert(1)}, ...)
- Policy Directive
- 구성
- <directive> <value> (지시문, 리소스 출처)
지시문(<directive>) 설명 default-src -src로 끝나는 모든 지시문의 기본 동작을 제어(CSP 구문 내에서 지정하지 않은 지시문이 존재할 경우 default-src를 따름) img-src 이미지를 로드의 출처를 제어 script-src 스크립트 태그 관련 권한 및 출처 제어 style-src 스타일시트 관련 권한 및 출처 제어 child-src 페이지 내에 삽입된 프레임 컨텐츠 출처 제어 base-uri 페이지 <base> 태그의 URL 제어
출처(<value>) 설명 *://example.com 출처의 scheme을 와일드카드를 이용해 표현 가능 https://*.example.com 출처의 호스트 서브도메인을 와일드카드를 이용해 표현 가능 (호스트 중간에 와일드 카드 사용 불가 i.e) https://www.*.com, https://*.example.*
또한 서브도메인을 와일드카드로 표현할 시, 서브도메인이 붙어있지 않는 도메인은 포함되지 않음 i.e) https://*.example.com으로 출처를 표기할 경우, https://example.com은 포함 안됨https://example.com:* 출처의 포트를 와일드카드를 이용해 표현 가능 none 모든 출처를 허용하지 않음 self 페이지의 현재 출처 (Same Origin) 내에서 로드하는 리소스만 허용 unsafe-inline 인라인 코드의 사용을 허용 unsafe-eval eval 과 같은 텍스트-자바스크립트 변환 메커니즘의 사용 허용 nonce-<base64-value> (nonce) 인라인 코드 사용 (base64-value) 요청마다 다른 난수 값을 설정해야 함 (해당 출처 설정 시 unsafe-inline은 무시됨) <hash-algorithm>-<base64-value> script 혹은 style 태그 내 코드의 해시 표현 (해당 출처 설정 시 unsafe-inline은 무시됨)
- <directive> <value> (지시문, 리소스 출처)
- 구성
- CSP 예시
// 모든 리소스의 출처를 현재 페이지와 같은 출처로 제한 Content-Security-Policy: default-src 'self' // 모든 리소스의 출처를 현재 페이지와 같은 출처와 "https://googleapis.com", "https://*.googleapis.com"으로 제한 Content-Security-Policy: default-src 'self' https://googleapis.com https://*.googleapis.com // 모든 리소스의 출처를 현재 페이지와 같은 출처로 제한하고, 이미지의 출처는 모든 호스트를 허용 // 스크립트 태그의 출처는 "static.dreamhack.io" 로 제한 Content-Security-Policy: default-src 'self'; img-src *; script-src static.dreamhack.io // 페이지 내에 삽입된 프레임 콘텐츠 URL은 현재 페이지와 같은 출처와 "frame.dreamhack.io" 내의 컨텐츠만 로드할 수 있음 Content-Security-Policy: child-src 'self' frame.dreamhack.io // base 태그의 URL을 허용하지 않음 Content-Security-Policy: base-uri 'none' // 자바스크립트 코드 내 eval 과 같은 텍스트-자바스크립트 변환 메커니즘의 사용을 허용 Content-Security-Policy: script-src 'unsafe-eval' // 스크립트 태그 내 인라인 코드의 사용을 허용 Content-Security-Policy: script-src 'unsafe-inline' // 스크립트 태그의 nonce 속성에 "YTQyYWZkODYtYWYyNy00ZGQzLTg2YjMtNzJhY2ZmOWY5OGNj" 값이 존재하지 않으면 스크립트 로드에 실패 Content-Security-Policy: script-src ‘nonce-YTQyYWZkODYtYWYyNy00ZGQzLTg2YjMtNzJhY2ZmOWY5OGNj' // 스크립트 태그 내의 코드 혹은 src 속성으로 지정된 파일의 sha256 해시를 base64로 인코딩한 결과가 "5jFwrAK0UV47oFbVg/iCCBbxD8X1w+QvoOUepu4C2YA="와 다르다면 스크립트 로드에 실패 Content-Security-Policy: script-src 'sha256-5jFwrAK0UV47oFbVg/iCCBbxD8X1w+QvoOUepu4C2YA='
퀴즈 - CRS
퀴즈 - CRS Natas 12 >> 13
Natas 12 >> 13 - 풀이
- View sourcecode
- if → 파일 입력이 존재할 경우(filename) 랜덤 경로를 만들어 파일을 저장
- 업로드 성공 시 링크를 통해 파일 접근 가능 → 비밀번호가 저장되어있는 경로의 파일을 여는 파일 업로드
- 랜덤 경로는 숫자와 알파벳 사이의 10개의 문자를 임의로 선정하여 생성
- 파일 업로드
- 조작 없이 업로드 할 경우 파일이 .jpg로 변경 → .php로 조작 후 전송
- View sourcecode
// pass.php <?php passthru("cat /etc/natas_webpass/natas13"); ?>
View sourcecode 파일 업로드 - 입력
- id → natas13
- pw → trbs5pCjCrkuSknBBKHhaBxq6Wm1j3LC
Natas 12 >> 13 Natas 13 >> 14
- 풀이
- View sourcecode
- if → exif_imagetype()
- 이미지의 첫 바이트를 읽어 이미지 여부를 체크 → php 파일에 GIF 파일 시그니처를 추가
- if → exif_imagetype()
- 파일 업로드
- 동일하게 .php 파일로 패킷 조작 후 업로드
- View sourcecode
// pass.php GIF89a <?php passthru("cat /etc/natas_webpass/natas14"); ?>
View sourcecode 파일 업로드 Natas 13 >> 14 '25-1 SISS > 웹해킹' 카테고리의 다른 글
- 컨텐츠 보안 정책(CSP)