티스토리 뷰

728x90

Form 인증 - CSRF (사이트 간 요청 위조)

2008년도에 있었던 옥션 해킹 사고도 CSRF로 공격을 했다고 한다. (해커가 옥션 운영자에게 CSRF 코드가 포함된 이메일을 보내서 관리자 권한을 얻어냈다)

..
<img src="http://auction.com/changeUserAcoount?id=admin&password=admin" width="0" height="0">
..
  1. 옥션 관리자가 관리 권한을 가지고(이미 유효한 쿠키 발급된 상태로) 메일을 조회합니다.
  2. 해커는 위와 같이 태그가 들어간 코드가 담긴 이메일을 보낸다. 단, 관리자는 이미지 크기가 0이므로 이미지가 있는지 눈치를 채지 못합니다.
  3. 관리자가 메일을 열면 이미지 파일을 받아오기 위해 URL이 열리게 됩니다.
  4. 그렇게 되면 해커가 원하는 대로 관리자의 계정이 id와 pw 모두 admin인 계정으로 변경된다고 합니다.

다른 예시

<html>
  <body>
    <form action="https://vulnerable-website.com/email/change" method="POST">
      <input type="hidden" name="email" value="pwned@evil-user.net" />
    </form>
    <script>
      document.forms[0].submit();
    </script>
  </body>
</html>

취약한 웹사이트에서 쿠키를 보유중인 사용자가 트리거 행위를 합니다. 그러면 바로 hidden 타입으로 값을 해커 마음대로 변경해서 권한을 탈취할 수 있습니다.

강의 내용

1. 로그인 이후에 세션과 쿠키를 발급받는다. 인증을 받은 상태

2. 공격자가 사용자 이메일로 링크를 전달한다. 

3. 링크를 클릭 한 이후에 공격용 웹페이지에 접속하게 되면 그 페이지에는 img 태그가 width height 0으로 src를 쇼핑몰의 링크로 대체되어 있다.

4. 사용자는 이미 인증을 받았고 쿠키가 사용자의 브라우저에 저장이 되어있는 상태이다.

5. 공격자가 링크로 보낸 이미지의 src를 보면 해당 쇼핑몰의 url을 호출하고 있는데 이미 인증이 되어있는 상태이기 때문에 (탈취한 쿠키와 세션 값이 같음) 사용자의 의도와는 무관하게 등록을 하거나 삭제를 할 수 있다.

 

이것을 막기위해 스프링 시큐리티는 CsrfFilter가 존재한다.

Client 코드에서는 Form으로 인증할 때는 csrf 토큰을 같이 보내줘야한다. Ajax 비동기 요청을 할 때에도 헤더 값에 csrf 토큰을 넣어줘야지만 요청이 성공하게 된다.

Q&A

더보기

링크를 클릭한다는 의미는 사용자로 하여금 공격자가 유인한 사이트에서 실행한다는 의미입니다.

즉 공격자는 사용자가 이용하는 서비스의 URL 값을 자신이 만든 사이트에 심어 놓고 사용자를 유인한다음 링크를 클릭하게 해서 실제 사용자의 서비스에 접속이 되도록 한다는 의미입니다.

사용자는 이미 로그인이 되어 있기 때문에 세션 쿠키가 만들어진 상태이고 공격자가 심어 놓은 URL 의 액션을 실행한다고 해도 사용자의 서비스 시스템은 정상적인 사용자의 액션이라고 판단하게 됩니다.

그런데 사용자의 서비스 시스템이 해당 액션에 대해 csrf 토큰값을 요구할 경우 공격자의 사이트에는 사용자 서비스에서 사용자에게 발행한 csrf 토큰값을 알수가 없기 때문에 접근이 거부 됩니다.


더보기

csrf 공격은 간단히 요약하면 다음과 같습니다.

사용자가 본인이 속한 시스템에 접속하고 인증을 받은 상태라고 가정합니다.

이 때 세션이 생성되고 csrf 기능이 활성화 되어 있다면 서버는 응답헤더에 csrf 쿠키를 담아서 사용자에게 보냅니다.

이 상태에서 사용자가 공격자의 사이트에서 이미지를 클릭하게 되면 실제로는 공격자의 사이트이지만 소스 내부적으로는 전송하는 사이트가 사용자 본인의 시스템으로 되어 있는 것입니다.

그러면 사용자는 이미 본인의 속한 시스템에 인증을 받은 상태이고 세션까지 생성되어 있기 때문에 비록 공격자의 사이트에서 액션을 취하지만 서버에서는 사용자가 가지고 온 세션을 보관하고 있기 때문에 그대로 접근을 허용해 버립니다.

이럴 경우 사용자의 서버는 이전에 사용자에게 발급한 csrf 쿠키를 요청하게 되고 서버에 보관한 csrf 쿠키와 비교해서 일치하는지 여부를 판단하게 됩니다.

즉 서버에서 csrf 기능이 활성화 되어 있고 사용자의 최초 접속이 아닌 세션이 생성되어 있는 상태라면 무조건  csrf 를 검사하게 됩니다.

그렇기 때문에 공격자의 사이트에서 사용자의 시스템에 접속할 때 서버에서 발급한 csrf 쿠키를 가지고 가지 않으면 차단됩니다.

그리고 공격자의 사이트에는 csrf 쿠키가 존재하지 않고 만약 임의로 만들어도 서버의 값과 일치할 확률이 제로이기 떄문에 공격자의 침입으로 부터 안전하게됩니다.

출처

https://www.inflearn.com/course/%EC%BD%94%EC%96%B4-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0/dashboard

 

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함