문제를 들어가면 Login버튼과 Join버튼이 존재한다.
먼저 Join 페이지에 들어가려고 하면 Access_Denied가 뜨면서 들어갈 수 없다.
그래서 우선 로그인 페이지를 확인해보았다. 페이지는 단순하였으나 아이디와 비밀번호는 알 방법이 없었다.
또한 여러 공격을 시도해보았으나 아무 반응이 없어 로그인 페이지에서의 공격 시도는 그만두었다.
결국 Login페이지가 아닌 Join페이지에서 공격을 시도해야 한다고 생각하여 Join페이지를 찾기 위해 혹시나 하고 url에서 login.php를 지워보았다.
그러니까 디렉터리 리스팅 취약점이 존재하여 join.php페이지를 찾을 수 있었다.
join.php에 접근해보면 bye라는 문구만 보이고 아무것도 뜨지 않는다.
그래서 페이지의 소스코드를 확인해보았다.
소스코드 자바스크립트가 난독화 되어있는 것을 볼 수 있다.
우선 자바스크립트 코드를 이쁘께 줄바꿔주는 사이트를 사용해서 보기 편하게 해준다.
이후 크롬의 개발자 도구 콘솔창에서 코드를 전부 붙여넣은 후에 확인하고 싶은 부분을 입력하면 해독된 코드를 볼 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (eval(document.cookie).indexOf('oldzombie') == -1) {
alert('bye');
throw "stop";
}
if (eval(document.URL).indexOf(mode=1) == -1) {
alert('access_denied');
throw "stop";
} else {
document.write('<font size=2 color=white>Join</font><p>');
document.write('.<p>.<p>.<p>.<p>.<p>');
document.write('<form method=post action=join.php>');
document.write('<table border=1><tr><td><font color=gray>id</font></td><td><input type=text name=id maxlength=20></td></tr>');
document.write('<tr><td><font color=gray>pass</font></td><td><input type=text name=pw></td></tr>');
document.write('<tr align=center><td colspan=2><input type=submit></td></tr></form></table>');
}
코드를 전부 바꿔주면 이런 코드가 나온다.
확인해보면 oldzombie라는 쿠키가 있어야 하며, url에 mode=1이 있어야한다.
쿠키는 editthiscookie를 통해 쉽게 만들 수 있다.
그리고 url에 mode=1을 추가하면 join페이지에 접속할 수 있다.
아무 계정이나 시도해보면 성공적으로 회원가입을 할 수 있다.
로그인을 시도해보면 로그인은 되지만, admin으로 로그인 해야한다고 메시지가 뜬다.
다시 Join페이지로 돌아가서 admin으로 회원가입을 시도해보자
이미 존재하는 id라고 뜨면서 회원가입을 할 수 없다.
하지만 회원가입을 할 때 admin앞에 공백을 넣어주면 admin으로 회원가입이 되는 것을 볼 수 있다.
이제 새로 만든 admin계정으로 로그인 하면 문제를 풀 수 있다.