Network

[Security] CSRF와 XSS

프로그래민 2021. 3. 5. 17:26
반응형

CSRF란?

CSRF는 Cross Site Request Forgery의 줄임말로써 사이트 간 요청 위조를 의미한다. CSRF는 웹사이트의 취약점 공격중의 하나로써 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(등록, 수정, 삭제 등)를 특정 웹사이트에 요청하게 하는 것을 의미한다. 즉, 공격자가 CSRF의 취약점을 이용해서 사용자의 권한을 도용하여 특정 웹 사이트의 기능을 수행하게 하는 것으로써 의도치 않게 광고성 게시물이나 유해 게시물을 작성하는 것이 대표적인 예시 중의 하나이다. 

 

CSRF 과정

CSRF의 예시

CSRF 공격이 성공할려면 우선 사용자가 위조 요청을 전송할 웹사이트에 로그인하여 쿠키를 발급받아 놓은 상태여야 한다. 그 후 다음과 같은 과정을 거쳐서 CSRF가 일어난다.

  1. 공격자가 위조 요청을 준비해놓는다. 대표적으로 img태그의 src 속성, form 태그 등이 있다.
    (ex. <img src="https://test.com/member/logout>을 통해 의도치 않은 로그아웃 요청을 수행)
  2. 공격자가 만들어 놓은 위조 요청에 사용자가 접근할 수 있도록 위조 요청이 포함되어 있는 피싱 사이트를 사용자에게 제공한다.
  3. 사용자는 위조 요청이 포함되어 있는 피싱 사이트에 접속을 하고, 위조 요청을 웹사이트에 전송하게 된다.
  4. 웹사이트에서는 사용자의 로그인 정보를 통해 요청된 위조 요청들을 수행하게 된다. 위의 예시에서는 송금이 이루어진다.
    (ex. 광고성 게시물 작성, 유해성 게시물 작성 등등)

앞서 언급되었듯이 CSRF는 크게 두가지 조건 1. 사용자가 로그인한 상태 2. 공격자의 위조 사이트에 접속 을 만족해야 하기 때문에 자동 로그인 기능이 있는 웹사이트 등을 이용할 때 각별히 주의가 필요하다. 이러한 CSRF를 방지하기 위해 다음과 같은 방법들이 있다.

 

CSRF 대응방법

  1. Referrer 검증 : request의 header에 존재하는 referrer 속성을 확인하여 요청을 한 페이지의 정보를 검증하고 차단하는 방법이다. referrer을 확인 후 같은 도메인 상에서 들어온 요청이 아니면 차단하는 방법이고, 대부분의 방어가 가능하다.
  2. Security Token(CSRF Token) 검증 : 특정 조건(로그인 등)일 때 사용자의 세션에 임의의 난수 값을 저장하고, 사용자의 요청 마다 해당 난수를 포함시켜 전송한다. 그리고 요청이 들어올 때 마다 세션에 저장된 값과 요청으로 전송된 난수값이 일치하는지 서버에서 검증하는 방법이다. 
  3. Double Sumbit Cookie 검증 : 세션을 사용 못하는 환경에서 사용하는 방법으로 웹브라우저의 Same Origin 정책으로 인해 자바스크립트에서 타 도메인의 쿠키 값을 확인/수정하지 못한다는 것을 이용한 방법이다. 스크립트 단에서 요청 시 난수 값을 생성하여 쿠키에 저장하고, 동일한 난수 값을 요청 파라미터로 서버에 전송한다. 서버에서는 쿠키의 토큰 값과 요청시 들어온 파라미터의 토근 값이 일치하는 지 검사하는 방법이다.

이 외에도 CAPCHA를 이용하거나, form 태그 사용시 get 대신 post 방식을 사용하는 방법등이 있다.

 

 

XSS란?

XSS의 예시

XSS는 Cross Site Scripting의 약자로써 사이트 간 스크립팅을 의미한다. XSS는 웹 애플리케이션에서 많이 나타는 취약점 중 하나로 웹사이트의 관리자가 아닌 악의적인 목적을 가진 제 3자가 웹 페이지(게시판 등)에 악성 스크립트를 삽입하여 의도하지 않은 명령을 실행 시키거나 세션,쿠키 등을 탈취하는 것을 의미한다. 이름처럼 대부분 스크립트를 이용한 공격이 이루어지며 SQL Injection과 함께 대표적인 취약점으로 알려져있다. 또한 공격 패턴이 너무 많고 다양하기에 "XSS 취약점이 없는 사이트는 없다."라는 말까지 있다.

 

XSS의 종류

  • Reflected XSS : 공격자가 악성 스크립트를 클라이언트에게 직접 전달하여 공격하는 방식이다. 입력값이 즉시 나타나는 비 지속적인 유형이다. 특히 URL에 스크립트를 포함시켜 공격하는 경우가 대표적이며 URL이 길면 클라이언트가 의심하기에 URL을 단축 시켜서 짧은 URL을 만들어 공격하기도 한다. 서버에 스크립트를 저장하지 않기 때문에 서버에서 이루어지는 필터링을 피할 수 있는 공격 방식이다.
  • Stored XSS : 공격자가 악성 스크립트를 서버에 저장시킨 다음 클라이언트의 요청/응답 과정을 통해 공격하는 방식이다. 입력값이 DB, 파일, 브라우저 리소스 등에 저장되어 지속해서 발생하는 유형이다. 대표적으로 글쓰기 등을 통해 악성 스크립트를 서버에 저장하여 공격한다. 보통 서버에서는 필터링을 하기 때문에 성공하기 어렵지만, 한번 성공하면 광범위한 피해를 줄 수 있는 공격 방식이다.
  • DOM Based XSS : 피해자의 브라우저가 HTML 페이지를 분석하여 DOM을 생성할 때 악성 스크립트가 DOM의 일부로 구성되어 생성되는 공격이다. 서버의 응답 내에는 악성 스크립트가 포함되어 있지 않지만 브라우저의 페이지에 정상적인 스크립트가 실행되면서 악성 스크립트가 추가되서 실행되는 특징이 있다.

 

XSS의 위험성

XSS 공격은 다양한 클라이언트에 다양한 위험성을 부여할 수 있다. 다음과 같은 것들이 대표적이다.

  • 쿠키 및 세션정보 탈취 : XSS에 취약한 웹 게시판 등에 쿠키나 세션 정보를 탈취하는 스크립트를 삽입하여 게시물을 열람하는 유저들의 쿠키 및 세션 정보를 탈취할 수 있으며 탈취한 정보를 바탕으로 인증을 회피하거나 정보를 취득하는 권한을 가질 수 있다.
  • 악성 프로그램 다운 유도 : XSS 자체는 악성 프로그램을 다운 시킬 수 없지만 스크립트를 통해 악성 프로그램을 다운 받는 사이트로 리다이렉트 시켜서 유도를 할 수 있다.
  • 의도치 않은 페이지 노출 : XSS를 이용해 여러 HTML 태그를 삽입하여 원본 페이지와는 관련 없는 페이지를 노출 시키거나 페이지 자체에 수정을 가해 노출된 정보를 악의적으로 편집할 수 있다.
  • 시스템 관리자 권한 탈취 : 악성 스크립트를 통해 브라우저에 있는 제로데이 취약점 또는 패치되지 않은 취약점을 공격하여 사용자 시스템을 완전히 통제할 수도 있다.

 

XSS 대응방법

XSS는 공격 패턴이 다양하고 계속 변화하기에 많은 대응방법이 있다. 기본적으로는 다음과 같은 대응방법이 있다.

  • 입/출력값 검증 : 입출력 값에 대해 목적에 맞는지 다양한 검증(정규표현식, 문자열 패턴, 길이 등)을 한다.
  • 입력값 치환 : 태그에 사용되는 <, > 등의 기호를 &lt;, &gt; 등의 HTML entity로 치환해준다.
  • 보안 라이브러리 사용 : 오픈소스 보안 라이브러리를 활용하여 XSS를 방지한다.
    (ex. naver의 lucy-xss-filter, lucy-xss-servlet-filter)
  • HttpOnly 속성 사용 : 스크립트에서 document.cookie를 사용하여 쿠키에 접속하는 것을 방지하는 옵션을 사용한다.
  • CSP(Content Security Policy) : 사이트에서 직접 컨테츠별로 정책을 정의하여 사이트에서 허용한 컨텐츠에만 접근하도록 하는 브라우저 표준 보안 정책을 적용한다.
  • 올바른 Content-Type 사용 : 적절한 Content-Type을 지정하여 악성 스크립트가 실행되지 않도록 해준다.

 

XSS 공격 방지 7계명

OWASP(Open Web Application Security Project)에서는 XSS 공격 방지에 대해 7계명을 발표했다.

1. 허용된 위치가 아닌 곳에 신뢰할 수 없는 데이터가 들어가는 것을 허용하지 않는다.
2. 신뢰할 수 없는 데이터는 검증을 하여라.
3. HTML 속성에 신뢰할 수 없는 데이터가 들어갈 수 없도록 하여라.
4. 자바스크립트에 신뢰할 수 없는 값이 들어갈 수 없도록 하여라.
5. CSS의 모든 신뢰할 수 없는 값에 대해서 검증하여라.
6. URL 파라미터에 신뢰할 수 없는 값이 있는지 검증하여라.
7. HTML 코드를 전체적으로 한번 더 검증하여라.

 

 

출처
tibetsandfox.tistory.com/5?category=885921
lucete1230-cyberpolice.tistory.com/23
velog.io/@dnjscksdn98/Network-CSRF%EB%9E%80
sj602.github.io/2018/07/14/what-is-CSRF/
itstory.tk/entry/CSRF-%EA%B3%B5%EA%B2%A9%EC%9D%B4%EB%9E%80-%EA%B7%B8%EB%A6%AC%EA%B3%A0-CSRF-%EB%B0%A9%EC%96%B4-%EB%B0%A9%EB%B2%95
tibetsandfox.tistory.com/11?category=885921
반응형

'Network' 카테고리의 다른 글

[Web] HTTP와 HTTPS  (0) 2021.12.09
[Network] 리피터, 허브, 스위치, 라우터  (1) 2021.12.01