GET Admin 2
DATE : 2024/1/19 ~ 20
❗Capture The Flag
STEP_1) Login 페이지로 이동
로그인 페이지로 이동했을 때, 하단에 위치한 Sign Up 버튼을 클릭하면 회원 가입 페이지로 이동할 수 있다.
STEP_2) Sign Up 페이지에서 새로운 계정 생성
STEP_3) STEP_2에서 생성한 계정으로 로그인
STEP_4) 마이페이지로 이동
STEP_5) 비밀번호 변경 시도. (hanhxx1019 -> 1019)
마이페이지에는 비밀번호를 수정하는 기능이 있는데 admin의 비밀번호를 공격자가 원하는 대로
바꿔버리기 위해서 어떤 packet이 만들어지는 지 확인해볼 필요가 있다.
STEP_6) pw parameter로 변경할 비밀번호가 전달 됨을 확인
수정한 정보를 입력하고 Update 버튼을 누르는 경우, pw parameter로 수정하고자 하는 비밀번호가
전달되는 걸 확인!
STEP_7) GET method로 변환하여 응답 여부 확인
CSRF 공격을 수행할 때, POST method는 XSS 취약점이 존재해야 하기 때문에
우선, GET method 수행 가능 여부를 파악해보았다.
마우스 우측 Click! -> change request method -> packet Forward
해보면 에러가 발생했다는 응답이 돌아옴으로 GET method로 요청이 불가능함을 알 수 있다.
STEP_8) 게시판 페이지로 이동
GET method가 불가능하다면 POST method로 CSRF를 수행하면 될 것!
대신 XSS 취약점을 먼저 찾아볼 필요가 있다.
STEP_9) 게시물 작성 페이지로 이동
Stored XSS 취약점이 존재할 가능성이 있는 게시물에 스크립트를 작성해보기로 했다.
STEP_10) XSS 취약점 여부를 파악하기 위해 스크립트 삽입
STEP_11) STEP_10에서 작성한 게시물 클릭
STEP_12) 스크립트 실행 여부 확인
스크립트를 작성한 게시물을 요청하게 되면 성공적으로 팝업 창이 떴기 때문에
우리는 Stored XSS를 통해 CSRF를 수행하면 된다는 판단을 할 수 있다.
STEP_13) CSRF 공격을 수행하기 위한 스크립트 작성.
이번 CTF를 해결하기 위해 우리는 CSRF를 통해 admin의 비밀번호를 수정하고
수정된 비밀번호로 admin 계정에 로그인할 것이다.
이때 POST method로 CSRF 공격을 수행하기 위해서 <form> tag를 만들고
그 안에 수정할 비밀번호를 <input> - type이 password인 tag의 value로 적어주면 된다. (pw : 1234)
또한 사용자가 이 게시물에 접근했을 때, 인위적으로 만든 form이 보여서는 안 되며
보이지 않지만 값을 전달해야 하기 때문에 <script> tag를 이용해 자동적으로 제출하도록
스크립트를 작성한다.
💡iframe으로 form tag 결과를 넘긴다 해도 팝업 창은 뜨기 때문에 admin 봇이 눈치챌 수 있다.
이를 위해 sandbox="allow-scripts"를 iframe에 추가하면 팝업 창이 보이지 않게 된다.
STEP_14) STEP_13에서 스크립트를 작성한 게시물 주소를 admin에게 전달
admin이 자신도 모르게 비밀번호를 수정하는 요청을 서버에 보내도록 만들기 위해서 (= CSRF )
XSS 취약점이 존재하는 게시물에 스크립트를 작성했고,
이 게시물의 주소를 admin에게 전달하면 admin이 게시물에 접속하게 되면서
비밀번호 수정 요청이 서버로 휙 ✈️ 날아가게 되는 것이다.
STEP_15) 현재 로그인한 계정에서 로그아웃
admin이 문제 없이 전달한 링크로 접속했다면 비밀번호가 1234로 바꿔있을 것이다.
이제 admin 계정으로 로그인하기 위해 현재 계정에서는 로그아웃 한다.
STEP_16) 스크립트로 전달한 비밀번호를 입력해 admin 계정으로 로그인 (pw: 1234)
스크립트에 적어준 password 값을 비밀번호에 입력하고 admin 계정으로 로그인을 시도하면
이번 CTF의 목표인 FLAG를 확인할 수 있을 것이다.
STEP_17) admin 계정으로 로그인 성공 결과 확인.
Last updated