이번 문제는 세션에 연결되지 않은 쿠키값에 대한 CSRF취약점이 포함되어 있다.
wiener계정으로 로그인했을때 쿠키값을 보면 session값과 함께 csrfKey라는 쿠키값이 존재하는 걸 확인할 수 있다.
만약 csrfKey값을 임의로 바꾼뒤 이메일을 변경해 보면
허용되지 않은 토큰이라며 변경되지 않는다.
그럼 만약 carlos계정의 쿠키값과 토큰값을 넣으면 어떻게 될까?
이메일이 변경되는 걸 볼 수 있다.
그러면 내 토큰값과 쿠키값을 상대에게 주입한 후 이메일을 변경하면 상대방의 토큰과 쿠키값 없이도 변경이 가능하다.
브라우저에서 서버로 요청을 전송할 때 그 요청에 대한 응답에 Set-Cookie 헤더가 포함되어 있는 경우,
브라우저는 Set-Cookie에 있는 데이터를 저장하고, 이 저장된 데이터를 쿠키라고 부른다.
위처럼 서버의 응답에 Set-Cookie 헤더가 포함된 경우, normal이라는 이름의 쿠키에 yes라는 값이 저장된다.
Set-Cookie를 이용해 쿠키를 추가하는 방법은 검색기능을 이용하면 된다.
123을 검색했을 때
LastSearchTerm이라는 쿠키가 검색어로 저장되는 걸 볼 수 있다.
그럼 url에? search=123% 0d%0 aSet-Cookie:%20 csrfKey=gU96 SZwIM3 lP4 OXxYztzx68 vMYiEXavY을 입력해 보면
%0d는 개행문자로 줄 바꿈을 하기 때문에
?search=123
Set-Cookie:%20csrfKey=gU96SZwIM3lP4OXxYztzx68vMYiEXavY
이런 형태로 들어간다.
응답값으로 쿠키값이 포함되어 돌아오는 걸 볼 수 있다.
이를 통합하여 form문을 작성해 보면
여기서 우리가 만든 제출 기능 script를 변경해야 되는데
이는 자동 제출 스크립트가 실행될 때 이미지 요청과 응답이 완료되기 때문이다. (이미 요청과 응답이 완료되면 소용이 없음)
그렇기 때문에
제출 script를 삭제하고 onerror이벤트를 이용해 제출하면 문제가 풀린다.