Jaeilit

콘텐츠 보안정책(CSP) - XSS 공격 방어(2) 본문

TIL

콘텐츠 보안정책(CSP) - XSS 공격 방어(2)

Jaeilit 2022. 6. 14. 15:03
728x90

1 ) https://jaeilit.tistory.com/90

 

콘텐츠 보안정책(CSP)

Content Security Policy (CSP) XSS (교차 사이트 스크립팅) 및 클릭재킹 데이터 삽입 공격을 비롯한 특정 유형의 공격을 감지하고 완화하는데 도움이 되는 추가 보안계층 CSP를 활성화 하려면 HTTP 헤더를

jaeilit.tistory.com

 

1번글에서 CSP 와 XSS 를 간단하게 알아봤습니다.

 

CSP 를 설정하는 이유 )

 

콘텐츠 보안 정책은 XSS 공격, 데이터 인잭션 등을 막기 위한 클라이언트의 수단입니다.

 

html 의 <head> 태그 안에서 <meta> 태그로 정의 할 수 있지만,

meta 태그는 cdn 이 적용이 안되는 점과 HTTP 헤더에만 적용이 가능한 frame-ancestors 등의 문제가 있기 때문에 HTTP 헤더 사용하는 것이 저는 좋다고 생각합니다.

 

XSS 는 웹에서 스크립트를 실행할 때 해커가 스크립트에 악성 스크립트를 심어놓음으로써

 

1. 사용자가 로그인할때의 토큰, 쿠키 등과 같이 민감한 정보를 탈취 할 수 있습니다. 

2. 악성 프로그램 다운로드는 안되지만 악성코드를 심어 놓을 수 있다. (트로이 목마 등)

3. 잘못 된 페이지를 노출 시킬 수 있다.

4. 정보를 탈취함으로써 일반적이지 않는 시스템 권한을 얻을 수도 있다.

 

공격방법 위키)

 

공격 방법에 따라 Stored XSS와 Reflected XSS로 나뉜다.

 

Stored XSS는 사이트 게시판이나 댓글, 닉네임 등 스크립트가 서버에 저장되어 실행되는 방식이고,

Reflected XSS는 보통 URL 파라미터에 스크립트를 넣어 서버에 저장하지 않고 그 즉시 스크립트를 만드는 방식이다. 후술된 내용 대부분은 Stored XSS라고 생각하면 된다. Reflected XSS의 경우 브라우저 자체에서 차단하는 경우가 많아 상대적으로 공격을 성공시키기 어렵다.


크로스 사이트 스크립팅이란 이름 답게, 자바스크립트를 사용하여 공격하는 경우가 많다. 공격 방법이 단순하고 가장 기초적이지만, 많은 웹사이트들이 XSS에 대한 방어 조치를 해두지 않아 공격을 받는 경우가 많다. 여러 사용자가 접근 가능한 게시판 등에 코드를 삽입하는 경우도 많으며, 경우에 따라서는 메일과 같은 매체를 통해서도 전파된다. 심지어는 닉네임에 코드를 심기도 한다.

물론, HTML을 사용하는 것이기 때문에, Text-Only 게시판이나, BBCode를 이용하는 위키위키 등에서는 XSS가 발생할 일은 없다. 단, 나무위키의 경우 {{{#!html HTML}}} 을 이용해서 HTML 태그를 사용할 수 있으므로 취약점이 있을 수도 있다. 그래서 나무위키 초반에는 스크립트 태그와 이벤트 속성도 막지 않았다. 물론, 이는 후에 대부분 수정되었다.

주로 CSRF를 하기 위해서 사용되기 때문에 종종 CSRF와 혼동되는 경우가 있으나, XSS는 자바스크립트를 실행시키는 것이고, CSRF는 특정한 행동을 시키는 것이므로 다르다.

 

검사)

 

보통  OWASP ZAP  프로그램으로 검사를 하는게 좋지만 경우에 따라 웹사이트에서도 간단히 할 수 있다.

 

Mozila 가 좀 더 자세히 봐주는 듯 하긴하다...

 

OWASP ZAP :  https://www.zaproxy.org/

 

The ZAP Homepage

Welcome to ZAP!

www.zaproxy.org

웹사이트 검사 https://securityheaders.com/

 

Analyse your HTTP response headers

Quickly and easily assess the security of your HTTP response headers

securityheaders.com

웹사이트 검사 Mozila/ https://observatory.mozilla.org/

 

Mozilla Observatory

Error: Error: It appears that is an IP address, which only works for SSH scans. If this is what you intended, please click here to continue.

observatory.mozilla.org

 

nginx 헤더 설정)

사이트 보안을 위해 검사를 해봤을 때 가장 중요한 항목은 CSP 헤더 set 이다.

nginx 웹서버에는 엄청 많은.. 옵션들이 있었는데 그 중에서 여기에 맞는 것만 살펴보자.

 

 

1. X-Frame-Options

https://www.keycdn.com/blog/x-frame-options

 

X-Frame-Options - How to Combat Clickjacking - KeyCDN

The X-Frame-Options HTTP response header can help protect your visitors against clickjacking attacks by not allowing rendering of a page in a frame.

www.keycdn.com

Clickjacking(클릭재킹) 방지

iframe 을 클릭 했을 때 올바른 주소인척 클릭을 가로채서 다른 서버의 주소로 전송하는 방식

 

1. deny 프레임에서 페이지 로드를 완전히 비활성화합니다

2. sameorigin  페이지 자체와 동일한 출처의 프레임에 페이지를 로드할 수 있습니다.

3. allow-from uri 페이지가 지정된 원본 및/또는 도메인의 프레임에만 로드되도록 허용합니다.

 add_header X-Frame-Options "SAMEORIGIN";

 

2. X-Content-Type-Options (MIME 유형)

 

MIME 유형이 오염되는 걸 방지합니다.

MIME 는 미디어 유형이라고도 하고 개발자도구 네트워크탭에서 content-type 을 의미하기도 합니다.

MIME 유형에는

 

이미지일때는 image/gif image/jpeg 

비디오일 때는 aduio/???

요청헤더에 따라 정의 됩니다.

 

더 많은 MIME 유형

https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types

 

MIME types (IANA media types) - HTTP | MDN

A media type (also known as a Multipurpose Internet Mail Extensions or MIME type) indicates the nature and format of a document, file, or assortment of bytes. MIME types are defined and standardized in IETF's RFC 6838.

developer.mozilla.org

 

nosniff 을 설정하면 서버에서 text/html 이라고 내려주면 클라이언트는 text/html 으로 받습니다. 당연한 이야기이지만

오염을 방지한다 라는 의미로 생각하면 될 것 같습니다.

 add_header X-Content-Type-Options nosniff;

 

 

3. X-XSS-Protection

https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/X-XSS-Protection

 

X-XSS-Protection - HTTP | MDN

HTTP X-XSS-Protection헤더는 Internet Explorer, Chrome 및 Safari에서 제공하는 기능으로서, (XSS (en-US)) 공격을 감지 할 때 페이지 로드를 중지시킬 수 있습니다. 최신 브라우저에서는 Inline Javascript('unsafe-inli

developer.mozilla.org

 

 

브라우저가 XSS 공격을 감지하면 페이지 렌더링을 중단하는 옵션입니다.

 

<옵션>

1.  0 : XSS 필터링 사용 안함

2.  1 : XSS 필터링을 사용하되 필터링 된 부분만 렌더링 하기

3. 1; mode=block : 필터링 하고 렌더링을 중단하기

 

add_header X-XSS-Protection "1; mode=block";
 
4. Permissions-Policy
 
위치정보, 진동, 마이크 등 기능을 제한하는 옵션입니다.
 
add_header Permissions-Policy "geolocation none;midi none;notifications none;push none;sync-xhr none;microphone none;camera none;magnetometer none;gyroscope none;speaker self;vibrate none;fullscreen self;payment none;";
 
 
5. Referer-Policy
 
 

Referer-Policy이란?

Referer-Policy에서 Referer는 HTTP referer를 의미합니다. HTTP referer 브라우저로 웹 서핑을 할 때, 하이퍼링크를 통해 각각의 사이트로 방문 시 남는 흔적입니다. 예를 들어 A 웹사이트에서 B 웹사이트로

scshim.tistory.com

 
다른 사이트를 방문 했을 때 흔적을 남기느냐의 옵션입니다.
 

strict-origin 방문한 사이트가 https 일때만 남기도록 설정함.

 add_header Referrer-Policy "strict-origin";
 
 
 
6. Content-Security-Policy
 
가장 중요한 콘텐츠 보안 정책입니다.
 
페이지의 리소스를 불러올때 제한을 두는 것입니다.
 
옵션에는 앞선 블로그 포스팅 글에서 살펴 봐서 생략하겠습니다.
 
 
7. 에러페이지
 
콘텐츠 보안과는 상관이 없다고도 볼 수 있지만
에러페이지에서도 정보를 탈취당할수 있다고해서 설정합니다.
// 프록시에서 에러를 인터셉트 함
proxy_intercept_errors on;
	// 에러코드를 정의하고 에러페이지로 연결
    error_page 404 403 500 503 /error-page.html;

    location = /error.html {
       // 에러페이지에서 보여줄 페이지 경로
       
        root /user/share/nginx/html/50x.html;
 
 
  // location이 nginx 내부 요청에서만 유효하고 외부 요청에서는 404로 응답하도록 한다.
  // 에러 페이지 등에 사용하면 좋다.			
		internal;
    }
 
 
 
 
전체코드

 

728x90

'TIL' 카테고리의 다른 글

pqsl db 생성  (0) 2022.06.22
nginx 로컬에서 띄우기  (0) 2022.06.16
콘텐츠 보안정책(CSP)  (0) 2022.06.08
로컬에서 메타태그 테스트 하는 방법  (0) 2022.05.26
SVG vs PNG  (0) 2022.05.24