컴언

'CSRF'에 해당되는 글 1건

  1. CSRF (Cross-site Request Forgery, 사이트 간 요청 위조) (3)

CSRF (Cross-site Request Forgery, 사이트 간 요청 위조)

공부

요즘 django 공부하면서 신기했던 것이 csrf_token(클릭하면 django Documentation 로 이동합니다.) 라는 CSRF 공격에 대비하기 위해 토큰을 넣어주는 기능이 있다. 예를 들어, form 을 submit 하기 전에 unique token을 같이 보내서 유효성을 검사하는 것. 

실제 사례로 2008년 옥션에서 1800만 명(우리나라 인구의 거의 절반 ㅡ.ㅡ;; )의 개인정보가 해킹된 방식도 CSRF 공격이었다. 해커가 옥션 운영자들에게 CSRF 공격 코드가 심어진 이메일을 보내서 관리자 정보를 알아냈다는... 어쨌든 왜 토큰을 넣어주어야 하는지 등을 알아보기 위해 CSRF 공격의 원리를 정리해본다.


옥션: 윽~ 미안해~ 사실 전체 회원 개인정보가 다 유출 됐었네~~

내 개인정보 ㅠㅠ


쉽게 예를 들어보겠다.


1. 해커 A 와 인터넷 뱅킹 계정을 가진 B 가 있다. B는 현재 인터넷 뱅킹에 로그인되어 있다.

B는 인터넷 뱅킹 http://bank.com 을 이용하는데, 다른 통장에 이체하기 위해서는 관리자로 로그인 유효한 쿠키를 가진 채로 http://bank.com/transfer?amount=[이체금액]&sendTo=[이체할 계좌번호] 에 접속해야 한다.


2. 해커 A 는 다음과 같은 코드가 담긴 이메일을 B에게 보낸다.


<img src="http://bank.com/transfer?amount=1000000&sendTo=[해커의 계좌 번호]">

3. B 가 이 이메일을 열면 이미지 파일을 받아오기 위해 위 URL 을 열게 된다.

4. URL 이 열리면 백만 원이 해커의 통장으로 이체되는 마법이 생겼다. 그것도 B의 컴퓨터에서. 서버는 B의 쿠키가 맞으니 이체를 허락할 수밖에 없다. 





공격 방법이 생각보다 간단한 만큼 막는 방법도 쉽다.


다양한 방법이 있지만 여기서는 unique token 을 이용한 대책을 설명해본다.


1. 은행 서버에서 transfer 전에 무작위 token 을 사용자에게 부여한다. 이 토큰은 사용자 외에는 알 수 없다.

참고로 Django 에서는 다음과 같이 csrf_token 태그를 이용하면 된다.

{% csrf_token %}

2. transfer 시 token 을 대조하여 token 이 없거나 틀리면 이체를 거부한다. 참 쉽죠?





결론


CSRF 은 마치 가스 밸브 같은 존재... 안전상 사용 안 할 때는 당연히 잠가야 하지만 까먹는 경우도 생기기 마련이다. 잠그는 게 어려운 것도 아니고 말이다. CSRF 도 방어가 어렵지는 않다. 다만 웹사이트 제작 과정에서 보안을 고려할 때 간과할 수도 있다. 그러므로 Django 와 같은 웹 프레임워크를 열심히 씁시다.  망할 옥션의 개인정보 유출 사건도 재래적인 CSRF 공격이었다는 것, 이제부터는 조심하자.


참고: https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)

'공부' 카테고리의 다른 글

CSRF (Cross-site Request Forgery, 사이트 간 요청 위조)  (3) 2016.06.30