[SK shieldus Rookies 19기][애플리케이션 보안] Cross-Site Request Forgery (CSRF) 크로스 사이트 요청 위조

Sungwuk·2024년 3월 31일
0

Cross-Site Request Forgery (CSRF)란?

인증된 사용자가 의도하지 않은 요청(생성, 삭제, 수정 등)을 보내도록 유도할 수 있는 공격. 이 공격은 사용자가 다른 웹사이트(공격자가 제어하는)에 접속했을 때 악의적인 요청이 실행되도록 만든다. 요청에 대해서 사용자가 의도한 대로 작성되고 전송된 것인지 확인하지 않는 경우 발생.

보안대책

  • 프로그램사이의 토큰
  • 세션겸증과 재인증을 유도

토큰이란?

웹 등에서 개인을 확인하기 위한 수단의 하나이다. 토큰에는 크게 두 가지 종류가 있는데, 무작위의 값을 생성하여 정보가 담기지 않는 일반 토큰과 특정 데이터를 담아 생성하는 클레임 기반 토큰이 있다. 클레임 기반 토큰중에 가장 대표적인 것은 JSON 웹 토큰(JWT)이다.

그럼 문제를 풀어보자


비박스 CSRF (Change Password) 로그인한 사용자의 비밀번호를 변경 신청하는 페이지

<h1>CSRF (Change Password)</h1>
    <p>Change your password.</p>
    <form action="/bWAPP/csrf_1.php" method="GET">
        
        <p><label for="password_new">New password:</label><br>
        <input type="password" id="password_new" name="password_new"></p>

        <p><label for="password_conf">Re-type new password:</label><br>
        <input type="password" id="password_conf" name="password_conf"></p>  

        <button type="submit" name="action" value="change">Change</button>   

    </form>
    <br>

서버에 전달되는 값

http://bee.box/bWAPP/csrf_1.php?password_new=1234&password_conf=1234&action=change

단순 비밀번호를 변경하는 페이지인데 뭐가 문제일까?

인증을 하지 않기 때문. 기존 비밀번호 인증 혹은 2차 본인확인 인증을 해야하지만 그렇게 하고 있지 않고, 그렇기 때문에 새로운 값만 입력하면 비밀번호를 쉽게 수정할 수 있다.

그럼 그 요청을 하게 CSRF를 이용하여 비밀번호를 2345로 변경하는 스크립트 코드를 만들어보면

로그아웃 후 2345로 로그인하면 로그인 되는걸 확인 할 수 있다.


그럼 이걸 어떻게 막아?

  1. 텍스트 기반 토큰
  • 선행 페이지가 호출되었을 때 서버 사이드에서 임의의 값을 생성하고 (세션에) 저장
  • 사용자 화면에 전달
  • 서버가 가지고 있는 값과 사용자 요청을 통해서 전달된 값을 비교, 일치하는 경우에만 정상적인 절차를 통한 요청으로 확인하고 처리
  1. reCHAPTCH

    구글에서 개발한 자동화된 프로그램이나 로봇이 웹사이트의 폼을 자동으로 제출하는 것을 방지하기 위한 보안 기술 중 하나이다. 이는 주로 스팸 봇이나 악의적인 봇에 의한 자동 가입, 댓글 스팸, 폼 스팸 등을 방지하는 데 사용된다. reCAPTCHA는 사용자에게 간단한 인증 과정을 제공하여 사람임을 확인하고, 로봇이나 자동화된 스크립트가 아닌지를 확인한다.

  • CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart)

    사용자가 웹사이트에 액세스하거나 어떤 작업을 수행하기 위해 이미지에 포함된 텍스트를 입력하는 등의 작업을 수행하여 자동화된 프로그램이 아니라는 것을 증명해야 한다. 사용자가 올바른 텍스트를 입력하면, 이는 사람임을 확인하는 데 사용된다.

  • Invisible reCAPTCHA:

    사용자가 웹사이트를 방문할 때 자동으로 실행되며, 사용자가 사람인지 로봇인지를 판별하기 위한 보이지 않는 보안 검증 프로세스다. 보통 사용자의 동작 패턴 및 사용 환경을 분석하여 로봇인지를 감지하고, 사용자에게 추가적인 인증을 요청할 수 있다.

profile
https://github.com/John-Jung

0개의 댓글

관련 채용 정보