5번을 들어가면 login버튼과 join버튼 2가지 말고는 아무것도 없습니다. 그래서 login 버튼을 눌러보면
로그인 화면이 보이고 여기에 아무 아이디를 넣어서 로그인 시도를 하면 Wrong password 표시가 뜨면서 로그인을 할 수 없습니다.
그래서 join 버튼을 누르면
위처럼 메시지가 뜨면서 페이지에 접근할 수 가 없습니다. 그래서 소스코드를 분석해보면
소스코드 부분에서 각 버튼의 onclick 핸들러를 주목해서 보면 login버튼은 move함수를 통해 동작하고, join버튼은 no함수를 통해 동작하는데 no함수를 보면 무조건 alert를 띄워주는 형식입니다. 그래서 문제를 해결하기 위한 join페이지를 다른 방법으로 찾아야합니다.
소스코드를 보면 mem/login.php로 이동하는 문구가 있습니다. 여기서 우리는 취약점을 이용해서 서버에 저장되어있는 페이지를 볼 수 있는 페이지로 이동할 수 있는데. url에서 /mem까지만 입력한뒤 이동하게 되면
위처럼 현재 존재하는 페이지를 확인할 수 있습니다. 원래 이 페이지는 사용자가 접근할 수 없게 되어야 하는데 이 페이지는 그렇지 않은 것으로보아 여기서 첫번째 취약점을 확인할 수 있었습니다. 그래서 이 페이지를 이용해 join.php로 이동하게 되면
bye가 alert되면서 검은화면이 뜹니다. 하지만 url을 확인해보면 join.php에는 정상적으로 접속이 된 것을 알 수 있습니다.
그러면 여기서 다시 소스코드를 분석해서 문제를 해결할 방법을 찾아야합니다.
여기서 주목해야할 부분은 이부분입니다. 처음에 딱 이부분을보면 무슨뜻인지 코드를 해석하기가 쉽지 않습니다. 그래서 제가 개행부분만 다시 수정한 결과
l='a';
ll='b';
lll='c';
llll='d';
lllll='e';
llllll='f';
lllllll='g';
llllllll='h';
lllllllll='i'
llllllllll='j';
lllllllllll='k';
llllllllllll='l';
lllllllllllll='m';
llllllllllllll='n';
lllllllllllllll='o';
llllllllllllllll='p';
lllllllllllllllll='q';
llllllllllllllllll='r';
lllllllllllllllllll='s';
llllllllllllllllllll='t';
lllllllllllllllllllll='u';
llllllllllllllllllllll='v';
lllllllllllllllllllllll='w';
llllllllllllllllllllllll='x';
lllllllllllllllllllllllll='y';
llllllllllllllllllllllllll='z';
I='1';
II='2';
III='3';
IIII='4';
IIIII='5';
IIIIII='6';
IIIIIII='7';
IIIIIIII='8';
IIIIIIIII='9';
IIIIIIIIII='0';
li='.';
ii='<';
iii='>';
lIllIllIllIllIllIllIllIllIllIl=lllllllllllllll+llllllllllll+llll+llllllllllllllllllllllllll+lllllllllllllll+lllllllllllll+ll+lllllllll+lllll;
lIIIIIIIIIIIIIIIIIIl=llll+lllllllllllllll+lll+lllllllllllllllllllll+lllllllllllll+lllll+llllllllllllll+llllllllllllllllllll+li+lll+lllllllllllllll+lllllllllllllll+lllllllllll+lllllllll+lllll;
if(eval(lIIIIIIIIIIIIIIIIIIl).indexOf(lIllIllIllIllIllIllIllIllIllIl)==-1)
{
alert('bye');
throw "stop";
}
if(eval(llll+lllllllllllllll+lll+lllllllllllllllllllll+lllllllllllll+lllll+llllllllllllll+llllllllllllllllllll+li+'U'+'R'+'L').indexOf(lllllllllllll+lllllllllllllll+llll+lllll+'='+I)==-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='+llllllllll+lllllllllllllll+lllllllll+llllllllllllll+li+llllllllllllllll+llllllll+llllllllllllllll+'>');
document.write('<table border=1><tr><td><font color=gray>id</font></td><td><input type=text name='+lllllllll+llll+' maxlength=20></td></tr>');
document.write('<tr><td><font color=gray>pass</font></td><td><input type=text name='+llllllllllllllll+lllllllllllllllllllllll+'></td></tr>');
document.write('<tr align=center><td colspan=2><input type=submit></td></tr></form></table>');
}
위처럼 정리할 수 있는데 각 알파벳과 숫자, 기호들을 일정 패턴으로 지정하여 프로그래밍이 되어 있는 것 같습니다. 그리고 여기서 if문들을 해석할 수 있다면 acess_denied나 bye가 뜨지 않으면서 정상적으로 회원가입할 수 있는 페이지를 띄울수 있을 것 같은 느낌을 받은 것이 input태그 등이 document.write등으로 쓸 수 있게 프로그래밍 되어 있기 때문입니다. 이 부분을 조금 편리하게 해독해주는 기능을 크롬에서 제공하고 있습니다.
크롬의 개발자 도구(f12)의 console 부분에 먼저 변수 지정 부분을 넣어줍니다.
그리고 아래 부분에 우리가 해독하고자 하는 조건문에서 난독화되어 있는 코드를 넣어주면 자동으로 알파벳이나 숫자로 전환해주는 기능을 제공합니다.
위처럼 우리가 보기 쉬운 부분으로 해독이 가능합니다. 이렇게 해독한 코드를 이용해서 소스코드를 변경해보면
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로 설정되어야 회원가입페이지가 뜨는 것을 알 수 있습니다.
이렇게 조건을 맞춰주면
회원가입 페이지인 join페이지에서 가입부분이 정상적으로 보입니다.
이렇게 단순하게 가입을 하려고 하면
이미 아이디가 존재한다는 메세지를 볼 수 있습니다.
그래서 아래 처럼 아이디에 공백 2칸을 주고 회원가입을 하게 되면 정상적으로 가입이 완료됩니다,
이렇게 가입된 아이디로 로그인페이지에서 로그인하면 문제가 해결됩니다.
* 이 문제를 통해서 개발자도구를 사용해서 난독화된 코드를 해독하고 그 부분을 통해서 조건문을 우회하여 문제를 푸는 법을 배울 수 있는 좋은 문제였던 것 같습니다.
'웹 > webhacking.kr' 카테고리의 다른 글
webhacking.kr 8번 (0) | 2021.02.01 |
---|---|
webhacking.kr 6번 (0) | 2021.01.31 |
webhacking.kr 10번 (0) | 2021.01.27 |
webhacking.kr 7번 (0) | 2021.01.27 |
webhacking.kr 23번 (0) | 2021.01.20 |