https://webhacking.kr/challenge/web-05/
이번 문제는 로그인을 성공해야 하는 문제인 듯 싶다.
문제 페이지에 접속해보면 위와 같이 로그인 버튼과 Join 버튼만 덩그러니 놓여 있다.
해당 페이지의 소스코드를 살펴보자.
<input type=button value='Login' style=border:0;width:100;background=black;color=green onmouseover=this.focus(); onclick=move('login');>
<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
'해킹 > webhacking.kr' 카테고리의 다른 글
[webhacking.kr] Challenge(Old) old-10 풀이 (0) | 2022.06.20 |
---|---|
[webhacking.kr] Challenge(Old) old-07 풀이 (0) | 2022.06.19 |
[webhacking.kr] Challenge(Old) old-06 풀이 (0) | 2022.06.18 |
[webhacking.kr] Challenge(Old) old-04 풀이 (0) | 2022.06.15 |
[webhacking.kr] Challenge(Old) old-01 풀이 (0) | 2022.06.14 |