풀이일 : 23/06/06
문제에 접속해보자. 다음과 같은 화면을 볼 수 있다.
3가지 페이지에 하나씩 접속해보자.
1. vuln(csrf) page
csrf-1 문제와 같이 param으로 전달된 값 중에 script가 *로 치환된 것으로 보인다.
2. flag
다음과 같은 화면이 출력된다.
3. login
username과 password를 입력하고 로그인할 수 있는 페이지가 표시된다.
다음으로 문제 소스코드를 확인해 보자.
-> guest의 password는 guest, 그리고 admin의 password는 FLAG인 것으로 추정이 가능하다.
-> session_storage 라는 이름의 파이썬 딕셔너리가 정의되어 있다.
1. 최상위 페이지
-> 일단 쿠키 값으로부터 session_id를 가져오는 것을 볼 수 있다. 그 후, session_id를 가지고 session_storage에 저장된 username을 가져온다. username을 가져오는 것에 실패하면 로그인이 되어 있지 않은 상태로 판단하여 'please login'이라는 메시지를 화면에 출력한다.
로그인이 되어 있고, username이 admin이면 플래그를 화면에 출력한다. 그렇지 않다면 'you are not admin'을 화면에 출력한다.
=> 우리는 admin 계정으로 로그인해야 FLAG를 얻을 수 있다!
2. /vuln 페이지
-> url로 입력받은 파라미터를 가져와 필터링 처리하는 것을 확인할 수 있다. "frame", "script", "on" 이라는 단어가 있는 경우 "*"로 필터링 처리한다.
3. /flag 페이지
-> flag 페이지를 이용하여 POST 요청을 하는 코드를 자세히 살펴본다. 일단 파라미터를 받아 param에 넣어준다. 이후 랜덤하게 session_id를 생성하고 해당 session_id 'admin'이 대응된다. 이후 check_csrf를 호출하고 정상적으로 실행되면 "good"를 화면에 출력한다.
4. /login 페이지
-> 입력받은 username과 password를 가져와 로그인을 수행한다.
5. /change_password 페이지
-> 화면에는 표시되지 않았던 change_password 페이지를 찾을 수 있었다. 파라미터로 바꿀 password를 받아 pw에 넣어준다. 그리고 현재의 session_id에 해당되는 username을 session_storage에서 가져와 해당되는 username의 password를 사용자가 입력한 새로운 pw로 변경하는 것을 확인할 수 있다.
일단 change_password 페이지를 이용해 보도록 하자.
비밀번호를 아는 guest로 로그인을 진행한다.
비밀번호를 password로 바꿔보자
-> 화면에 Done이 표시된다.
새로운 비밀번호 password로 다시 guest로 로그인해보자.
정상적으로 로그인이 수행되었다!
이전에 각 페이지의 코드를 하나씩 살펴볼 때 flag 페이지에서 admin에 대응되는 session_id가 생성된 것을 확인할 수 있었다.
-> flag 페이지에서 change_password 페이지에 접속하여 원하는 패스워드를 pw로 주면 admin 계정의 패스워드를 변경할 수 있을것으로 추정된다!!
<img src="/change_password?pw=admin">
/change_password 페이지에 접속하여 admin 계정의 패스워드를 admin으로 바꿔보도록 하자.
login 페이지에서 admin/admin으로 로그인을 시도한다.
-> admin 계정으로 로그인에 성공하여 플래그를 획득하였다!!
DH{c57d0dc12bb9ff023faf9a0e2b49e470a77271ef}