What is CSRF?

심야·2023년 7월 14일
0

모의해킹

목록 보기
15/47

CSRF (Cross Site Request Forgery)

피해자 세션을 사용해 피해자 의도와 상관없이 서버로 위조된 요청을 보내는 공격

게시판, 메일함과 같이 로그인 해야만 사용 가능한 서비스에서 발생하는 취약점이다.

어디서 발생하는가?

모든 요청에서 발생한다. 하지만 비밀번호 변경, 이메일 주소 변경, 관리자 계정 등록, 계정 삭제, 글 작성, 수정 등과 같은 민감한 요청에서 더욱 취약하다.

CSRF vs XSS

둘다 클라이언트 측을 공격하는 점을 동일하다.

  • CSRF 피해자가 자신의 의도와 상관없이 서버로 임의의 요청을 하게 만드는 공격
  • XSS 피해자 브라우저 측에서 악성 스크립트를 실행하는 공격

공격 기법

  • GET Method
    로그인 한 다음에 볼 수 있는 페이지에 URL을 삽입해 공격한다.
  • POST Method
    반드시 XSS 취약점을 찾아야 한다. 세션을 이용해야 하기 때문에 꼭 같은 도메인에서 XSS 취약점을 찾아야 한다. 도메인(naver, google) 별로 쿠키가 다르기 때문에 꼭 같은 도메인이어야 한다.
    <form method="POST">
    </form>
  • Referer Bypass
    아래 태그로 referer 우회한다.
    <meta name=”referrer” content=”no-referrer”>
  • CSRF Token Bypass
    CSRF Token 값을 가져와 비밀번호를 변경한다. 이를 가능하게 하려면 XSS 공격이 가능해야 한다.
     1. id 속성을 포함한 iframe 태그로 특정 링크에 요청한다. 
      2. getElementById()로 element를 가져온다.
      3. DOM 객체의 첫번째 form 태그에서 csrf_token 파라미터의 value 값을 가져온다.
      4. "csrf_form" id 속성을 포함한 form 태그를 생성하고 수정 요청을 전송할 url을 입력한다.    
      5. 수정할 비밀번호를 입력한다.
      6. 자바스크립트로 csrf_token 값을 가져왔다면 form 태그에 token 값을 전달한다.
      7. form submit
  • CSRF Stealth 공격 iframe , fetch() , Ajax 등을 사용해 사용자가 알아채지 못하게 공격을 진행한다.
    [CSRF Stealframe with 자동전송]
    <iframe width="0" height="0" border="0" name="stealthframe" id="stealthframe" style="display: none;"></iframe>
    
    <form method="POST" action="https://0a78009604f862f3808a21b900a200af.web-security-academy.net/my-account/change-email" target="stealthframe">
    <input type="hidden" name="email" value="normal@test.com">
    </form>
    <script>
    document.forms[0].submit();
    </script>

대응 방안

  1. 개인정보 수정과 같은 페이지에서 CSRF 취약점이 발생한다면 해당 요청에 인증 정보를 추가한다.
    ex) 기존 패스워드 입력, 핸드폰 인증 번호 입력, 인증 링크 발송 등

  2. 게시판 글쓰기, 수정과 같이 패스워드 입력, 인증 번호 입력 등 인증을 하지 않는 페이지에서 CSRF 취약점이 발생한다면 Referer Check, CSRF Token, SameSite Cookie 등을 사용해 대응한다.

  3. Captcha

    bot 의 자동화 요청을 막기 위해서 captcha 사용

SSRF

Server Side Request Forgery

어디서 발생하는가?

서버가 외부 자원(API, resource)을 이용하는 URL 을 파라미터로 받는 경우

언제 사용하는가?

  1. 내부망 자원에 접근 할 때 ex) 관리자 페이지
  2. ssh, ftp, file 요청 등을 통해 내부망에 접근할 때
  3. 내부망 다른 서버에 접근할 때

대응 방안

파라미터로 url 요청하지 않는다.

profile
하루하루 성실하게, 인생 전체는 되는대로.

0개의 댓글