ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Web Secure Headers
    Web 2019. 5. 17. 14:45

    https://www.owasp.org/index.php/OWASP_Secure_Headers_Project#hsts

     

    OWASP Secure Headers Project - OWASP

    Join hundreds of other Developers and InfoSec professionals for Training, Sessions and Community at our first conference of 2019[AppSec Tel Aviv, May 26-30th]

    www.owasp.org

     

     

    헤더이름 앞에 X가 붙은것은 보통 사용자정의헤더를 말한다.

    예전엔 사용자정의시 X를 꼭 붙여야했지만 지금은 안붙여도 된다.

    밑에나올 X로 시작하는 헤더옵션은 모두 다른 사람들이

    제작한것인데 널리 쓰여서 유명한 것들이다.

     

    또한 아래에 나올것들은 브라우저에서 지원하는

    기능에 대한 제어 헤더로

    모든 브라우저의 모든 버전이 지원하는 것은 아니므로

    기능을 헤더에만 의존하면 안된다.

     

    헤더 설명
    X-Frame-Options <frame><iframe>Mobject> 사용(렌더링) 여부
    clickjacking 공격을 막기위해사용
    deny : 같은사이트내에도 허용X
    sameorigin : frame 대상이 현재와 같은주소인것만 허용
    allow-from 주소(url) :  해당하는 주소허용
    X-XSS-Protection XSS 공격을 감지할때 페이지 로드 중지여부 0 : 필터링안함 / 1  : 사용
    1;mode=block : 사용. 영역을 제거하지않고 렌더링을안함
    HSTS  
    HPKP  
    X-Contnet-Type-Options  
    CSP 브라우저에 특정 리소스 세트를 허용 가능한 것으로 처리하고 나머지는 거부하도록 명백히 지시하는 방법  
    X-Permitted-Cross-Domain-Policies    
    Referrer-Policy    
    Expect-CT    
    Feature-Policy    

     

     

     

     

     


    X-Frame-Options


     

     

     


    X-XSS-Protection


     

     

     

     


    Do Not Track (


    개인 사용자를 추적하는 행위를 거부한다고 요청할때 사용

     

     

     

     

     


    X-Forwarded-For (HTTP Request)


     

    원래의 IP주소를 식별하기 위한 표준 헤더

     

    클라이언트는 전송과정 중간에 프록시를 경유하여 IP가 변경된채로 서버로 요청이 간다.

    Forwarded 

     

     

     

     


    Content-Security-Policy


     

    브라우저는 애플리케이션의 스크립트와 공격자가 악의적으로 주입한 스크립트를 구분하지 못한다.

    브라우저는 출처에 관계없이 페이지에서 요청하는 코드라면 무엇이든 다운로드하여 실행한다.

    XSS 공격을 방지할 수 있다.

    신괴할 수 있는 출처를 명시할 수 있다.

    브라우저는 해당 출처에서 받은 리소스만 실행하거나 렌더링한다.

    script-src : 스크립트 관련 권한 집합을 제어

    self : 현재 페이지(same-origin)를 유효한 소스로 지정

    url : 해당 url을 유효한 소스로 지정

    그외의 소스에서는 스크립트를 로드하지 않고 오류를 발생시킨다.

     

    Content-Security-Policy: script-src 'self' https://apis.google.com

     

    페이지가 로드되도록 허용하는 리소스를 세분화하여 제어할수있다.

     

     

    지시문

    CSP 지시문 설명 ( 설정하지 않으면 기본값이 * 로 적용된 상태)
    default-src 지시문에 대한 기본값 설정(-src로 끝나는 모든 지시문에 적용됨)
    script-src <script> 스크립트 요소에 나타날 수 있는 URL 제한
    style-src <style> 스타일시트 요소에 나타날 수 있는 URL 제한
    base-uri <base> 요소에 나타날 수 있는 URL 제한
    frame-src 지원이 중단되었음 child-src사용
    child-src 작업자와 삽입된 프레임 콘텐츠(source)에 대한 URL을 나열
    connect-src XHR, WebSockets, EventSource를 통해 연결할 수 있는 출처 제한
    font-src 웹 글꼴을 제공할 수 있는 출처 지정
    form-action <form> 태그에서 제출을 위한 유효한 엔드포인트 나열
    frame-ancestors 현재 페이지에 삽입할 수 있는 소스 지정. <frame> <iframe> <embed> <applet> 태그에 적용됨. <meta>태그에서 사용할 수 없고 HTML 이외의 리소스에만 적용됨
    img-src 이미지를 로드할 수 있는 출처를 저으이
    media-src 동영상과 오디오를 제공하도록 허용되는 출처를 제한
    object-src 플래시와 기타 플러그인에 대한 제어를 허용
    plugin-types 페이지가 호출할 수 있는 플러그인 종류 제한
    report-uri CSP 위반시 브라우저가 보고서를 보낼 URL 지정. 이 지시문은 <meta> 태그에서 사용불가
    upgrade-insecure-requests 사용자 에이전트에 URL구성표를 다시 작성하여 HTTP를 HTTPS로 변경하도록 지시. 이 지시문은 다시작성해야할 이전 URL이 많은 웹사이트를 위함
    sandbox 페이지가 로드할 수 있는 리소스가 아닌 페이지가 취할 수 있는 작업에 대한 제한을 둔다. 

    전체 허용 : *

    현재 출처를 허용하지만 하위도메인은 허용하지않음 : 'self' 

    모든 URL허용안함 : 'none'

    인라인 자바스크립트 및 CSS 허용 : 'unsafe-inline'

    eval 같은 텍스트-자바스크립트 메커니즘 허용 : 'unsafe-eval'

     

    예시

     *://*.example.com:* : 임의의 포트에서 임의의 구성표를 사용하는 example.com의 모든 하위 도메인 허용(하지만 example.com 자체는 아님)

     

    헤더에 여러 지시문을 나열하고 싶은경우 세미콜론(;)으로 구분

    지시문에 필요한 리소스를 전부 나열해야함

    같은 지시문이 두번이상 정의되면 첫번째것만 적용

     

    정책이 페이지단위로 적용되기 때문에 매 응답마다 HTTP 헤더를 함께 보내야함

    특정 페이지에 따라 정책을 미세하게 제어가능

     

     

    X-WebKit-CSP, X-Content-Security-Policy 헤더도 있으나

    최신부라우저는 접두사가 없는 Content-Security-Policy를 사용

     

     

    sandbox 지시문이 있는 경우 페이지는 sandbox속성을 가진 <iframe> 내부에서 로드된것처럼 취급

    페이지에 광범위한 효과를 미칠 수 있음 페이지를 고유한 출처로 강제 적용하고 양식 제출을 방지한다

     

     

    CSP에서 기본 설정된 전송 메커니즘은 HTTP 헤더이다

    마크업 페이지에서 정책을 직접 설정할수도 있다

    http-equiv속성을 포함한 <meta> 태그를 사용

    <meta http-equiv="Content-Security-Policy" content="default-src https://cdn.example.net; child-src 'none'; object-src 'none'">

     

    frame-ancestors, report-uri, sandbox 는 페이지에서 설정불가

     

    허용하는 출처목록을 작성하는 것을 기반

    하지만 XSS의 가장 큰 최대 위협인 인라인 스크립트 주입문제는 해결하지 못함

     

     

     

    자바스크립트의 작성

    자바스크립트 함수를 on 이벤트의 인라인으로 적용하기 보다 보다는

    엘리먼트에 id를 주고 addEventListener로 이벤트를 적용하는것이 좋다.

     

    꼭 사용해야한다면 nonce 값을 준다.

    <script nonce=EDNnf03nceIOfn39fn3e9h3sdfa>
      //Some inline code I cant remove yet, but need to asap.
    </script>

     

     

    Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'

    난스는 추축할 수 없도록 페이지의 모든 요청에서 다시 생성해야한다.

     

    해시를 사용하면

    Content-Security-Policy: script-src 'sha256-qznLcsROx4GACP2dm0UCKCzCG-HiZ1guq6ZZDob_Tng='

     

    CSP는 sha384- sha512 지원

     

    SHA 해시 생성

     

     

    비활성 상태의 텍스트를 실행 가능한 자바스크립트로 변환하고 공격자 대신 실행하도록한다

    eval()

    new Function()

    setTimeout([string], ...)

    setInterval([string], ...)

    전부 벡터로서, 이걸로 주입된 텍스트가 의도와는 달리 악성 코드로 실행될 수 있다.

     

    CSP로 이러한 벡터를 전부 차단해야한다.

     

    eval()에 의존하지 않고 JSON.parse를 통해 JSON을 파싱해야한다.

     

    문자열이 아닌 인라인 함수로 작성해야한다.

    setTimeout("document.querySelector('a').style.display = 'none';", 10);
    이걸 아래와같이 작성
    setTimeout(function () {
      document.querySelector('a').style.display = 'none';
    }, 10);

     

    런타임에서 인라인 템플릿 방지

    많은 애플리케이션이 new Function()을 이용해 런타임에서 템플릿 생성 속도를 높인다

    동적 프로그래밍 애플리케이션이지만 악성 테스트를 평가할 위험이 있다.

     

    문자열을 실행하지 못하게 하면 공격자로서 사이트에서 인증되지 않은 코드를 실행하기가 어려워진다

     

     

     

    Content-Security-Policy: default-src 'self'; ...; report-uri /my_amazing_csp_report_parser;

    JSON형식의 위반 보고서를 해당url에 POST를 보낸다

     

    {
      "csp-report": {
        "document-uri": "http://example.org/page.html",
        "referrer": "http://evil.example.com/",
        "blocked-uri": "http://evil.example.com/evil.js",
        "violated-directive": "script-src 'self' https://apis.google.com",
        "original-policy": "script-src 'self' https://apis.google.com; report-uri http://example.org/my_amazing_csp_report_parser"
      }
    }

    보고서 형태

    위반이 발생한 페이지(document-uri)

    그 페이지의 참조 페이지(referrer)

    페이지의 정책을 위반한 리소스(blocked-uri)

    그 리소스가 위반한 특정 지시문(violated-directive)

    페이지의 전체 정책(original-policy)

     


    Content-Security-Policy-Report-Only


    CSP의 정책 위반시 리소스를 차단하지는 않지만 

    지정하는 위치로 보고서를 보내고 싶을때 사용

     

    CSP의 두 헤더를 사용해 특정 정책은 차단하고 특정 정책은 보고서면서 모니터링할 수 있음

    Content-Security-Policy-Report-Only: default-src 'self'; ...; report-uri /my_amazing_csp_report_parser;

     

    'Web' 카테고리의 다른 글

    [nodejs] express 사용하기  (0) 2019.05.25
    [Web] quick nodejs  (0) 2019.05.25
    HTTP 개요  (0) 2019.05.13
    웹 취약점/공격기법과 대응  (0) 2019.05.12
    HTTP Header  (0) 2019.05.06
Designed by Tistory.