1 분 소요

CSRF ( Cross Site Request Forgery ) 란

  • 요청을 위조하는 공격이다.
  • 피해자가 몰랐던 요청을 서버에 보내게 하는 공격이다.
  • 피해자는 자신의 의도와는 다르게, 서버로 임이의 요청을 하게 만드는 공격이다.
  • 피해자 세션을 활용한 공격이다.

발생 위치

  • 모든 요청에서 발생할 수 있다.
  • 비밀번호 변경, 이메일 주소 변경, 관리자 계정 등록 등.

중요

  • 단 피해자가 로그인을 한 채로 링크를 클릭해야 피해자 세션 정보로 요청이 보내진다.

공격 방법

GET 방식일 때

  • CSRF 공격이 쉬워진다.
  • 요청을 주는 url을 만들어 사용자에게 주어 클릭하도록 만들어주면 된다.

POST 방식일 때

  1. 가장 간단한 방법은 사용자가 클릭하게 유도하는 방법.
  2. XSS 취약점과 CSRF 취약점을 합쳐서 공격하는 방법. 단 같은 도메인에서 두개(xss, csrf)의 취약점이 나타나야 한다.
  • iframe 을 이용하여 form post 결과를 iframe 에서 볼 수 있게 만든다. 이러면 페이지 이동은 없으면서 사용자는 자신도 모르게 요청을 보내게 된다.
<iframe width="0" height="0" border="0" name="frame" id="frame" style="display:none;"></iframe>


<form method="POST" action="xxx" target="frame">
	<input>
</form>

<script>
document.forms[0].submit();
</script>

CSRF 방어하기

CSRF를 Referrer 로 막기

Referrer 란?

  • 이 요청을 어디서 한 건지 확인하는 용도이다.

Referrer 로 막기

  • 예를들어 마이페이지에서 비밀번호 변경 요청이 와야 정상 요청이다.
  • 게시판 같은 곳에서 비밀번호 변경 요청이 오면 비정상적인 요청인 것 이다.
  • 요청을 어디서 한 것인지 확인하여 비정상적인 요청이면 막아 CSRF 공격을 예방할 수 있다.

CSRF 토큰을 이용하여 막기

CSRF 토큰 란?

  • CSRF 를 막기위해 만들어진 것 이다.
  • 서버에서 CSRF 토큰을 발행하여 요청이 발생하는 페이지에 몰래 넣어둔다.
  • 사용자가 요청을 보내면 토큰 값도 같이 요청의 파라미터로 보내진다.

CSRF 토큰으로 막기

  • 사용자가 요청한 토큰 값과 서버에 저장된 토큰 값이 일치해야 정상적인 요청이라 판단한다.
  • 따라서 공격자는 서버에서 발행하는 CSRF 토큰을 알 수가 없어 CSRF 공격을 성공시킬 수 없다.
<form method="POST" action="~~">
... 생략 ...
<input type="text" style="display:none;" value="csrf 토큰">
... 생략 ...
</form>

우회 방법

Referrer Check Bypass

  • referrer 헤더 체크 동작방식이 다음과 같으면 referrer 헤더를 없애서 검사를 우회할 수 있다.
만약 referrer 헤더가 존재하면
	검사시작
없으면
	그냥 패스
  • 다음 방법으로 referrer 헤더를 없앨 수 있다.
<meta name="referrer" content="no-referrer">

CSRF 토큰 Bypass

  • XSS 취약점을 이용하여야 한다.
  • 먼저 토큰을 발행하는 페이지를 찾는다.
  • iframe 을 활용해 준다. 토큰 발행 페이지를 iframe을 통해 불러오고, iframe 에 접근하여 토큰을 파싱해 온다.
  • 토큰과 같이 요청을 서버로 보내면 공격성공이다. 서버는 CSRF 토큰을 보고 정상적인 요청이라 판단한다.
<iframe src="csrf 토큰을 발행하는 페이지"> </iframe>
<script>
iframe 접근하여 csrf 토큰을 파싱해서 가지고 온다.
</script>

XSS 와 CSRF 차이점

CSRF

  • 피해자가 자신도 모르게 서버로 임이의 요청을 보내게 하는 공격이다.

XSS

  • 클라이언트 측 스크립트를 삽입하는 공격이다.

댓글남기기