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