Admin is Mine
문제 접속 후
주어진 계정으로 로그인해 보았다.
loginProc.php 페이지를 통해
사용자 인증 성공 시,
서버에서 JSON 형태로 result:ok 값을 응답하고,
클라이언트가 index.php 페이지를 요청하면서
index.php 페이지에 로그인이 된 것을 확인할 수 있었다.
참고로 로그인이 되지 않았을 때, index.php로 접근하면 다시 로그인 페이지로 돌려보낸다.
반대로 사용자 인증 실패 시,
서버에서 result:fail 값을 응답하는 것을 볼 수 있다.
이러한 통신을 보았을 때,
뒤에 로직을 알 수는 없지만,
pw를 통한 인증 결과와는 상관없이
result 값이 ok 라면
index.php 페이지에서 로그인이 된 것으로 간주하는 로직일 것이라고 추측할 수 있었다.
추측을 바탕으로
주어진 계정으로 로그인 요청을 보낸 뒤,
인터셉트 기능을 사용하여
userId 값을 admin으로 바꾸어 요청을 보내고
응답으로 온
result:fail 값을
ok로 변조해서 브라우저에 전달했다.
이후 클라이언트는 index.php를 요청하고
그 요청에 대한 응답으로
Flag가 적힌
admin으로 로그인된 index.php 페이지를 반환받을 수 있었다.
<script>location.href='login.php';</script>
참고로 위 스크립트 때문에 브라우저에서는
로그인 페이지로 이동되어 flag를 보기 힘들다.
해결 방법은 마찬가지로 응답을 받았을 때,
인터셉트 기능을 사용해서 해당 스크립트를 지우고 브라우저에 보내면 사진과 같이 index.php 페이지를 출력할 수 있다.
BurpSuite Response Intercept 설정
위와 같이
burpsuite [setting] - [Response interception rules]에서
Response 값을 가로채겠다에 체크해 줘야
우리가 사용하는 intercept 기능에서 서버의 응답 값을 볼 수 있다.