ABOUT ME

아무것도 없음

Today
Yesterday
Total
  • [SISS/웹해킹 스터디] 25-1학기 3주차 스터디 - Content Security Policy, Natas 12 >> 14
    25-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(, …)
      • 예시
    // 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은 무시됨)

     

    • 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로 조작 후 전송
    // 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 파일 시그니처를 추가
      • 파일 업로드
        • 동일하게 .php 파일로 패킷 조작 후 업로드
    // pass.php
    GIF89a
    <?php passthru("cat /etc/natas_webpass/natas14"); ?>

    View sourcecode
    파일 업로드
    Natas 13 >> 14

Designed by Tistory.