Stored XSS : LAB [3]
DATE : 2024/1/17
Last updated
DATE : 2024/1/17
Last updated
이번에 살펴볼 LAB은 XSS & CSRF의 Collaboration이다.
제목을 보면 알 수 있듯이 CSRF를 수행하기 위한 XSS 공격을 수행하는 것이 이번 LAB의 목표!
최종적으로 수행하고자 하는 건 다른 사용자의 이메일 주소를 수정하는 스크립트를 삽입하는 건데
이를 위해 LAB에서는 사용할 계정을 제공해주고 있다.
My account 페이지에서 wiener:peter로 로그인하면 아래와 같은 화면을 볼 수 있을 것이다.
사용자의 이메일 주소를 수정할 요청이 어떻게 생겼는지 알기 위해선
직접 이메일을 업데이트 해보는 게 제일 쉬운 방법이다.
바꿀 이메일 주소를 입력한 뒤, packet을 확인해보니
이메일 주소를 변경하기 위해 서버에게 보낸 요청은 POST method이며
email & csrf parameter가 body로 전달되고 있음을 파악할 수 있다.
이 csrf 값이 어디에서 왔나 확인해봤더니 로그인한 사용자의 My account에
hidden 처리된 <input> tag에 들어 있었다.
사용자 브라우저에서 최종적으로 이메일을 수정하도록 하려면 사용자의 csrf 값이 필요하다.
따라서 우리는 csrf 값에 접근하기 위한 경로를 파악할 필요가 있다.
경로를 파악하기 전에! 스크립트를 삽입할 포인트부터 확인해보면
블로그 게시물에 댓글 본문에 위와 같이 입력했을 경우,
스크립트 결과를 확인할 수 있을 것이다. 이는 댓글 본문에 스크립트를 삽입할 수 있음을 의미한다.
이번엔 게시물 댓글에 스크립트를 작성해 console 창에 csrf 값을 띄워보려고 한다.
자신의 csrf 값을 자신의 브라우저에 띄우는 건 의미가 없지만,
이를 수행하는 건 csrf에 접근하기 위한 JS 상 경로를 파악하기 위함이다.
스크립트를 저장한 뒤, 해당 블로그로 다시 접근하게 되면
저장된 댓글도 함께 브라우저로 전달 되는 과정에서 스크립트도 함께 오면서
console 창에 출력된 csrf 값을 확인할 수 있을 것이다.
이제 csrf 경로도 확인했겠다 공격 스크립트를 작성해 댓글 창에 입력하기만 하면 된다.
하나의 스크립트 예시를 들자면 위오 같이 fetch API를 활용해 작성해볼 수 있을 것이다.
POST method로 수정하고자 하는 이메일 값과 csrf값을 서버로 보내면
서버는 csrf 값을 확인한 후, email에 담긴 값으로 요청을 보낸 사용자의 이메일을 수정해줄 것이다.
(실제로 사용한 스크립트는 XMLHttpRequest를 사용했음)
댓글을 업로드 한 후 조금만 지나면 다른 사용자가 해당 게시물에 접속하면서
스크립트가 실행돼 아래와 같이 LAB이 해결되었다는 헤더를 볼 수 있을 것이다.