로그인한 뒤, 공지사항에 게시글을 작성하려 했으나 게시글 작성 버튼이 없다.
작성된 게시글 페이지와 게시글 목록 페이지 URL
에 일정한 패턴이 있다. 글쓰기 페이지의 URL
은 notice_write.php
로 추측된다. 만약에 글쓰기 페이지에서 권한 검증을 하지 않는다면 글쓰기에 성공할 것이다.
notice_list.php
요청을 인터셉트 해 notice_write.php
로 수정하여 요청하였다.
권한 검증을 하지 않기 때문에 성공적으로 글쓰기 페이지에 접근하였다.
글을 작성 후 create
버튼을 클릭해 FLAG를 획득하였다.
게시판에 접속해 “flag 임시 저장” 글을 읽으려 했으나 권한이 없다는 알림이 발생한다.
읽기 권한이 없어 글을 읽을 수 없지만 수정 페이지에서 권한 검증을 안 한다면 글을 읽을 수 있다. notice_read.php
요청을 인터셉트 해 notice_update.php
로 수정하여 다시 요청했다.
수정 페이지에 접근하였지만 권한이 없다는 알림과 글 목록 페이지로 리다이렉트 하는 자바스크립트 코드가 있다.
클라이언트 측에서 자바스크립트로 권한 검증을 하는 방법은 버프스위트 같은 프록시 도구를 활용하면 우회할 수 있다. 따라서 버프스위트 인터셉트 기능으로 응답 페이지의 자바스크립트 코드를 제거한 뒤, 인터셉트를 해제하겠다.
정상적으로 수정 페이지에 접근하였고 FLAG를 획득하였다.
admin 계정 마이페이지에 접근해야 하지만 admin 계정 정보를 모른다. 우선 sfUser 계정의 마이페이지에 접근하였다. URL
을 보니 계정 명이 파라미터에 전달된다.
계정 명으로 test
를 입력하니 test
계정 마이페이지에 접근할 수 있다. 마이페이지는 본인만 접근할 수 있어야 하지만 본 사이트는 권한 검증이 미흡해 계정 명만 알고 있다면 마이페이지에 접근 가능하다.
admin 계정의 마이페이지에 접근해야 하므로 user 파라미터에 admin을 입력하고 요청해 FLAG를 획득하였다.
이전 문제와 동일하게 user 파라미터로 계정 명을 입력 받아 admin
계정의 마이페이지를 요청했으나 로그인한 계정의 마이페이지만 응답한다. 추측하건대, 쿠키와 세션으로 권한 인증을 수행하는 것 같다. 만약에 유추하기 쉬운 쿠키와 세션 ID를 사용한다면 권한 인증을 우회할 수 있다. 다시 로그인 해 어떻게 세션ID를 발급하는지 확인하겠다.
로그인 과정을 버프스위트로 확인하니, 로그인에 성공하면 서버 측에서 계정 명을 Set-Cookie
에 담아 응답한다.
다시 로그인하고 응답 페이지의 Set-Cookie
값을 admin으로 수정하겠다.
로그인에 성공하면 index.php
페이지로 리다이렉트 되는데 클라이언트 측에서 서버에 권한 인증을 위해 요청하는 Cookie에 admin
이 담겨있다.
마이페이지를 요청하는 경우에도 마찬가지다. 요청하는 URL의 파라미터는 계정 명이 입력되었지만 Cookie는 admin을 담고 있다.
서버 측은 sfUser
가 아니라 쿠키에 담겨있는 admin
으로 인식하기 때문에 권한 인증을 우회하여 admin 계정의 마이페이지에 접속한다. 그리고 FLAG를 획득하였다.