이번 문제는 이메일 변경 기능에 취약점이 존재하고 CSRF 공격을 방지하지만 사이트의 세션 처리 시스템에 통합되지 않는다고 한다. 또한 로그인할 수 있는 계정을 2개 준다.
사이트의 세션 처리 시스템에 통합되지 않는다
이게 이 문제의 핵심인데
서버에서는 유저들을 구분해야 하기 때문에 세션을 저장할 서버가 필요하다.
위 그림은 sticky session 방식으로 고정된 세션을 의미하는데
User1 이 1번부터 3번까지의 서버 중 1번 서버에 세션을 생성하였다면, 이후에 User1이 보내는 모든 요청은 1번 서버로만 보내지게 된다. 즉, Load Balancer는 User가 첫 번째 세션을 생성한 서버로 모든 요청을 리다이렉트 하여 고정된 세션만 사용하게 한다.
CSRF 토큰은 유저를 판별하는 기능은 없기 떄문에 세션을 구분해야 알맞은 유저의 토큰을 받아 판별할 수 있다.
이번 문제는 CSRF를 방지하기 위해 페이지를 새로고침 할 때 마다 토큰값이 바뀌게 된다.
하지만 세션이 구분되지 않아 올바른 토큰값만 받으면 유저 상관없이 통과된다면 어떻게 될까?
테스트를 위해 calros 계정의 토큰값을 확인하고
wiener 계정의 토큰값을 확인했다.
두 계정의 토큰값이 서로 다른것을 확인하고
wiener계정에서 익스플로잇 서버로 calros계정의 토큰값을 넣어 이메일을 변경해 보았다.
요청을 보내보면
wiener계정의 이메일이 바뀐 걸 확인할 수 있다.
이처럼 세션을 구분하지 않고 토큰값으로만 인증하면
내 계정의 토큰값으로 다른 계정의 정보를 바꿀 수 있다.