본문 바로가기
Portswigger/CSRF

Portswigger - CSRF where token is tied to non-session cookie solution

by jh117jh 2023. 10. 18.
728x90

이번 문제는 세션에 연결되지 않은 쿠키값에 대한 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이벤트를 이용해 제출하면 문제가 풀린다.

728x90