본문 바로가기
해킹/webhacking.kr

[webhacking.kr] Challenge(Old) old-05 풀이

by yenua 2022. 6. 17.
반응형

https://webhacking.kr/challenge/web-05/

 

Challenge 5

 

webhacking.kr

 

이번 문제는 로그인을 성공해야 하는 문제인 듯 싶다.

문제 페이지에 접속해보면 위와 같이 로그인 버튼과 Join 버튼만 덩그러니 놓여 있다.

해당 페이지의 소스코드를 살펴보자.

<input type=button value='Login' style=border:0;width:100;background=black;color=green onmouseover=this.focus(); onclick=move('login');>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<input type=button value='Join' style=border:0;width:100;background=black;color=blue onmouseover=this.focus(); onclick=no();>

<script>
function no()
{
alert('Access_Denied');
}

function move(page)
{
if(page=='login') { location.href='mem/login.php'; }

}

</script>

join 버튼을 누르면 access_Denied 라는 알림만 뜨도록 되어 있다.

login 버튼은 login.php로 연결되어 있으므로, join.php로 따로 접속해보자.

 

bye라는 알림이 뜨고, 검은 배경만 나오는데, 소스코드를 살펴보면 아래와 같이 난독화 되어 있는 것을 볼 수 있다.

<script>
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>');}
</script>

 세미콜론 부분을 개행시켜주면 아래와 같이 어느정도는 알아볼 수 있게 나온다.

하나하나 다 대입시켜보려고 하다가, 다른 writeup을 참고해보니 개발자 도구를 이용하면 쉽게 변환이 가능하다고 한다.

위 스크린 샷에서 39번줄까지 입력해주고, 그 밑의 코드들을 하나하나 입력해보면 무슨 뜻인지 알려준다.

이를 토대로 난독화된 코드를 해석해보면 아래와 같다.

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='+'NaNoin.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>');
}

index Of 함수는 해당 문자열의 위치를 리턴해주는 함수인데, 없으면 -1을 리턴한다.

따라서 쿠키에 oldzombie라는 문자열이 존재해야 하며, 주소에 mode=1 라는 문자열이 존재해야 한다.

 

쿠키 값을 아래와 같이 추가하였더니 bye 알림이 뜨지 않고 access_denied 알림이 뜨게 되었다.

 

주소 뒤에 ?mode=1를 붙여주었더니 아래와 같이 회원가입 창이 정상적으로 표시되었다.

test/test로 가입해주고

로그인 했더니 admin으로 로그인해야 한단다...

 

admin으로 회원가입 해보면 이미 존재하는 아이디라고 한다.

더보기

여기서 부터 막혀서 종강하고 난 다음 드림핵 문제 먼저 풀어보고 왔는데, tmitter 문제와 유사한 것 같아 id 입력칸의 20자 제한을 30자로 늘리고, id 값으로 아래와 같이 입력하였다.

admin               1234

admin으로 인식되지 않는다.. 혹시 몰라 로그인도 진행해보았지만 마찬가지였다.

 

join.php에 보내는 패킷을 잡아 admin뒤에 %00을 넣어 널문자를 추가해준다. 회원가입 화면에서는 \0도 같이 보인다.

로그인 패킷을 잡아 똑같이 입력해주면 admin 계정으로 로그인 되면서 문제를 솔브 할 수 있다.

 

이게 되네

 

참고자료

indexOf

https://hianna.tistory.com/379

 

반응형