본문 바로가기
Portswigger/CSRF

Portswigger - CSRF where token is not tied to user session solution

by jh117jh 2023. 10. 14.
728x90

이번 문제는 이메일 변경 기능에 취약점이 존재하고 CSRF 공격을 방지하지만 사이트의 세션 처리 시스템에 통합되지 않는다고 한다. 또한 로그인할 수 있는 계정을 2개 준다.

 

 

사이트의 세션 처리 시스템에 통합되지 않는다

이게 이 문제의 핵심인데

 

서버에서는 유저들을 구분해야 하기 때문에 세션을 저장할 서버가 필요하다.

위 그림은 sticky session 방식으로 고정된 세션을 의미하는데 

User1 이 1번부터 3번까지의 서버 중 1번 서버에 세션을 생성하였다면, 이후에 User1이 보내는 모든 요청은 1번 서버로만 보내지게 된다. 즉, Load Balancer는 User가 첫 번째 세션을 생성한 서버로 모든 요청을 리다이렉트 하여 고정된 세션만 사용하게 한다.

 

CSRF 토큰은 유저를 판별하는 기능은 없기 떄문에 세션을 구분해야 알맞은 유저의 토큰을 받아 판별할 수 있다.

 

이번 문제는 CSRF를 방지하기 위해 페이지를 새로고침 할 때 마다 토큰값이 바뀌게 된다.

하지만 세션이 구분되지 않아 올바른 토큰값만 받으면 유저 상관없이 통과된다면 어떻게 될까?

 

테스트를 위해 calros 계정의 토큰값을 확인하고 

wiener 계정의 토큰값을 확인했다.

 

두 계정의 토큰값이 서로 다른것을 확인하고

wiener계정에서 익스플로잇 서버로 calros계정의 토큰값을 넣어 이메일을 변경해 보았다.

wiener계정에서 carlos 토큰 사용

요청을 보내보면

wiener계정의 이메일이 바뀐 걸 확인할 수 있다.

 

이처럼 세션을 구분하지 않고 토큰값으로만 인증하면 

내 계정의 토큰값으로 다른 계정의 정보를 바꿀 수 있다.

728x90