안녕하세요. 휴먼스케이프 ted 입니다.
이번에는 OWASP의 2017 RC 버전에서도 Top 10에 속한 A8 — CSRF(Cross site request forgery)에 대해서 알아보고자 합니다.
OWASP에서 제공하는 웹 애플리케이션 보안 위험은 아래에서 확인해 볼 수 있습니다.
OWASP 한국어 버전 pdf : 2013년 판 | 2017년 판
RC버전도 찾게 되면 올려두겠습니다. 개정판들의 차이는 아래와 같습니다.
OWASP 2013과 2017RC의 차이, 출처 https://m.blog.naver.com/renucs/220981325968
아래 CSRF는 기존에 휴먼블로그에 XSS와 CSRF에도 적혀 있으니 미리 보고 오셔도 좋습니다 :)
A8 — CSRF(Cross site request forgery)
OWASP top 10 A8-CSRF 요약, 출처 : OWASP
CSRF는 사이트 간 요청 위조로 대표적인 웹 애플리케이션 취약점 중 하나입니다.
공격자가 작성한 글이나 메일을 읽거나 다른 사이트에 접속하면 그 순간 동시에 사용자의 클라이언트에서 의도치 않은 요청을 보내도록하여 공격자에게 이득이 되는 행동을 할 수 있습니다. 사용자는 자신의 의지와 무관하게 공격자가 의도한 행위를 하게 됩니다.[1]
2008년에 발생한 옥션의 개인정보 유출 사건에서도 관리자 계정을 탈취하는 데 이 방법이 사용 되었습니다.[2]
Cross-Site Scripting 하고 XSS는 유사한 점이 많은데요. 이 둘의 큰 차이점은 XSS는 사용자가 특정 웹사이트를 신뢰하는점을 노렸다면, CSRF는 사용자가 웹브라우저를 신용하는 상태임을 노렸다고 볼 수 있습니다. 예를 들면 XSS는 특정 웹사이트에 스크립트를 주입하여 탈취 시나리오를 가져갈 수 있지만, CSRF는 특정 웹사이트가 아니더라도 외부 사이트(피싱(phishing) 사이트)에 페이지를 만들어 공격 할 수 있습니다.
대표적인 시나리오로 아래와 같습니다.
게시판에 악의적인 글 도배
관리자 권한 획득
온라인 구매 정보 변조
로그아웃 시키기
위키에 정의되어있는 시나리오는 공격 과정은 위에서 정보 변조 시나리오에 대한 설명입니다.
탈취 시나리오, 출처 : 위키피디아
CSRF를 막기 위해서는 어떻게 해야할까요?
포인트는 다른 사이트에서 온 비정상적인 요청은 처리하지 않는다는 것입니다.
그러기 위해서 보통 CSRF token를 쓰곤합니다. 또한 RESTful한 설계(데이터를 조작할때 GET 사용 안함, 수정할때 POST사용안함)도 도움이 될수도 있습니다. 여기서는 대표적인 CSRF token에 대해서만 다루겠습니다.
CSRF token은 매 요청마다 값이 바뀌는 토큰으로 공통적인 값을 사용해서는 안되고 유추할 수 있어서도 안됩니다.
우리가 원하는 form 페이지를 요청 할 경우에만 CSRF token을 발급합니다.
form안에 CSRF token을 hidden으로 넣어 submit을 합니다.
요청을 처리할때 CSRF token이 발급된 token이 맞는지 검증합니다. (대개는 세션에 보관하거나, cookie에 encrypt해서 전송)
위 처럼 예방만 하더라도 꽤나 많은 악의적인 공격을 사전에 차단 할 수 있습니다.
좀 더 자세한 내용이 궁금하다면 아래의 Cheat Sheet를 읽어보는 것을 추천 드립니다.
Cross-Site Request Forgery (CSRF) Prevention Cheat Sheet
그럼 다음에 봐요~ 안녕~
출처 [1] https://ko.wikipedia.org/wiki/%EC%82%AC%EC%9D%B4%ED%8A%B8_%EA%B0%84_%EC%9A%94%EC%B2%AD_%EC%9C%84%EC%A1%B0 [2] https://namu.wiki/w/CSRF , http://www.asiae.co.kr/news/view.htm?sec=it4&idxno=2010032516442677942