문제분석 & 풀이
login, join 2가지 버튼이 존재한다.
join을 눌러보니 접근이 불가능하다고 떠서 login부터 시도했다.
blind sqli를 하는 문제인가 싶어서 여러가지 방법으로 sqli를 시도해보았지만 wrong password 라고만 뜬다.
디렉토리 리스팅 취약점이 존재하나 싶어서 mem 디렉토리에 접근해보니 접근이 된다.
이전에 접속하지 못한 join.php가 보이는데 접속해보자.
"bye" 라는 경고창이 뜨면서 빈 화면만 뜬다. 개발자도구(F12)를 이용해서 코드를 분석해보자.
코드가 난독화됐다.
여러 변수가 선언됐고 복잡한 변수들로 하단 HTML 코드가 작성되어있다.
변수를 각각 대입하여 HTML 코드를 번역해야 할 것 같다.
HTML 코드를 번역하면 위와 같이 나온다.
○ 코드 분석
1. document.cookie 에 oldzombie가 없으면 stop
2. document.URL에 mode=1 이 없으면 stop
3. 1,2번의 조건을 모두 통과하면 join 페이지가 등장
즉, oldzombie라는 쿠키를 생성하고 URL에 mode=1을 파라미터로 붙여서 전송하면 정상적인 join 페이지가 등장할 것이다.
개발자도구를 이용해서 oldzombie 쿠키를 생성 후, console에서 document.cookie를 확인해보니 "oldzombie="이라고 뜨는 것을 확인할 수 있다.
다음으로 URL에 mode=1 이라는 파라미터를 추가하고 요청해보자.
join.php 페이지가 떴다.
계정을 생성해보자. (필자는 guest / guest 로 생성)
정상적으로 계정이 생성됐다고한다.
login.php에 접속해서 로그인 해보자.
성공적으로 로그인이 됐지만 "admin"으로 로그인을 해야한다고 한다.
다시 join.php 로 돌아가서 admin 이라는 id로 계정을 생성해보았다.
계정을 생성하려고 하니 이미 존재하는 계정이라고 한다.
이번에는
[빈칸]admin
의 형태로 계정 생성을 시도했다.
admin으로 계정이 생성됐다고한다.
login.php에 접속해서
[빈칸]admin
로 로그인을 시도했다.