CSRF
Cross Site Request Forgery (사이트 간 요청 위조)의 줄임말로 웹 취약점 중 하나입니다.
사용자가 자신의 의지와는 무관하게 해커가 의도한 행위(데이터 수정, 삭제, 등록 등) 를 특정 웹사이트에 요청하게 되는 공격입니다.
예를 들면 사용자가 그저 버튼을 눌렀을 뿐인데 해커가 심어놓은 스크립트에 의해 내 계정의 인증과정을 거쳐서 사용자의 의도와 관계없이 광고성 글이 개시되는 것을 생각해볼 수 있습니다.
또한, 해커는 사용자의 권한을 도용하여 특정 웹 사이트의 기능을 실행하기도 힙니다.
동작원리
CSRF가 성공하려면, 아래 3가지 조건이 만족되어야 합니다.
사용자가 보안이 취약한 서버로부터 이미 로그인되어 있는 상태여야 합니다.
해커는 쿠키 기반의 서버 세션 정보를 획득할 수 있어야 합니다.
해커는 서버를 공격하기 위한 요청 방법에 대해 미리 파악하고 있어야 합니다.
CSRF 공격 과정
사용자가 보안이 취약한 서버에 로그인합니다.
서버에 저장된 세션 정보를 사용할 수 있는 session ID가 사용자의 브라우저 쿠키에 저장됩니다.
해커는 사용자가 악성 스크립트 페이지를 누르도록 유도합니다.
게시판이 있는 웹사이트에 악성 스크립트를 게시글로 작성하여 사용자들이 게시글을 클릭하도록 유도
메일 등으로 악성 스크립트를 직접 전달하거나, 악성 스크립트가 적힌 페이지 링크를 전달
사용자가 악성 스크립트 접근시 웹 브라우저에 의해 쿠키에 저장된 session ID와 함께 공격할 서버로 요청됩니다.
서버는 쿠키에 담긴 session ID를 통해 해당 요청이 인증된 사용자로부터 온 것으로 판단하고 처리합니다.
간단한 공격 예시
공격자는 아래와 같은 html 문서를 열도록 유도하기만 한다면 공격자가 의도한 패스워드 변경이 실행됩니다.
1 2 3 4 5 6
<form action="https://vulnerable-website.com/password/change" method="POST"> <input type="hidden" name="password" value="mypassword" /> </form> <script> document.forms[0].submit(); </script>
img 태그로 요청된 src 주소는 GET형식으로 처리가 되기 때문에 img 태그가 포함된 글을 보기만 해도 로그아웃을 시킬 수도 있습니다.
1
<img src="http://vulnerable-website.com/logout" />
대응 방법
Cookie Samesite
Cookie의 SameSite 속성은 외부 사이트에 쿠키 전송할 범위를 설정해서 방지합니다.
Referer Check
HTTP 요청 헤더 정보에서 Referer 정보를 확인하여 같은 도메인에서 보낸 요청인지 검증하여 차단합니다.
- Referer
- 현재 페이지에 요청한 이전 페이지의 uri 정보
CSRF Token
CSRF Token (임의의 난수)를 생성해 서버 메모리에 저장하고 클라이언트에 전달합니다.
클라이언트는 중요한 요청(생성, 삭제, 수정)을 보낼 때 파라미터로 CSRF Token을 같이 보내며 서버는 검증합니다.
CSRF 공격을 당해도 CSRF Token은 서버에 전달되지 않으므로 서버는 요청을 수행하지 않습니다.
CAPTCHA 사용
이미지를 보여주고 그 이미지에 해당하는 문자/숫자/그림이 아니라면 요청을 거부합니다.
사용자가 의도한 요청인지 아니면 트리거로 동작한 것인지 확인합니다.