워게임/webhacking.kr

webhacking.kr 5번

안녕하세요? LnullVE입니다. 오늘은 webhacking.kr 5번을 풀이해보도록 하겠습니다~


우선 문제에 들어가주시면,




이런식으로 칸 두개가 있는것을 볼 수 있습니다.


Login과 Join칸이 있습니다. 


우선 구경을 해야하니 Login을 해봅시다




이런식으로 진짜 login밖에 없는 form이 나옵니다.


기본적으로 로그인을 해보면




id는 admin이어야 봅니다.


그러면 Join 을 들어가 봅시다.





이런식으로 권한이 없다는것을 알 수 있습니다.  ...?


음... 소스를 봐야될것 같습니다. 다시 join과 login버튼이 있는곳으로 이동을 하여서 소스를 보면,


여기서 매우 중요한것을 확인할 수 있습니다.




간단한 해석을 해보겠습니다.


우선 button name은 각각 Login과 Join 이있고, Login 버튼을 클릭시 move함수를 호출합니다. 함수를 실행하게 되면 mem/login.php로 페이지가 넘어갑니다. 정상적입니다.


그러나! Join버튼을 누르면, no라는 함수가 호출되고, Access_Denied를 띄우게 됩니다. 이말은 어떤 인증이 아닌 그냥 무조건 저 경고문을 띄우는 겁니다.


그런데 login을 눌렀을때를 다시 봐보세요


사이트가 mem/login.php 인점을 보아 mem폴더(member라 추측가능) 안에 login.php파일이 있으면 join.php파일이 있을 가능성이 상당히 큽니다.  그러면 mem폴더로 가봅시다.



후훟 나의 추측은 맞았다!


이런식으로 join.php와 login.php를 볼 수 있습니다. 그러면 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) { bye; }


이 코드가있습니다.


만약 eval(?).indexof(?)==-1 이라면 bye라는 선언되지 않은 bye라는 것을 이용하여 에러가 나게되고 코드가 실행되지 않습니다.


그러면 (eval(lIIIIIIIIIIIIIIIIIIl).indexOf(lIllIllIllIllIllIllIllIllIllIl)==-1 이 얼만지 확인해보겠습니다.



이 조건문이 true라서 bye라는것이 실행(?)되게 되고, 에러를 일으키게 됩니다. 그러면 다음 조건문을 확인해보겠습니다.


if(eval(llll+lllllllllllllll+lll+lllllllllllllllllllll+lllllllllllll+lllll+llllllllllllll+llllllllllllllllllll+li+'U'+'R'+'L').indexOf(lllllllllllll+lllllllllllllll+llll+lllll+'='+I)==-1){alert('access_denied');history.go(-1);}


휴 길다...


이것도 조건문을 비교해서 값이 -1이면 denied띄어주고, 전페이지로 돌아가게 됩니다.


그러면 이 조건의 값이 얼마인지를 확인해 봐야 겠지요




흠... 사진이 너무긴점 양해부탁드리겠습니다.


이런식으로 값이 true 가 나오게 됩니다. 그러면 다음 조건문을 봐야겠지요...



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=5></td></tr>');document.write('<tr><td><font color=gray>pass</font></td><td><input type=text name='+llllllllllllllll+lllllllllllllllllllllll+' maxlength=10></td></tr>');document.write('<tr align=center><td colspan=2><input type=submit></td></tr></form></table>');}


호우 뭔가 하는 소스코드인것같습니다.


우선 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=5></td></tr>');document.write('<tr><td><font color=gray>pass</font></td><td><input type=text name='+llllllllllllllll+lllllllllllllllllllllll+' maxlength=10></td></tr>');document.write('<tr align=center><td colspan=2><input type=submit></td></tr></form></table>');


가 나오면서, 뭔가 어떤 폼을 작성하는것 같습니다. 그러면 이 스크립트를 램도둑크롬에다가 실행시켜봅시다.



이런식으로 Form 이 생긴것을 확인할수있습니다. 그러면 id를 admin, pass = 1234로 해보겠습니다.




Her... 울먹울먹 


그러면 인젝션을 해야될것 같습니다. Not sql injection




이런식으로 id : (maxlength=5) pw : (maxlength=10) 으로 지정을 하고있는것을 확인할 수 있습니다.


그러면 id만 인젝션을 시키면 되니, 서버측에서 id 5글자만 비교한다는 가정하에 우리는 6글자를 보내면 어떻게 될까요?


보내기 위해서 maxlength값을 6으로 고쳐주고, 마지막에 공백(엄연한 문자) 를 넣어줍시다.




따단 sign up 이라네요 그러면 로그인을 하러 가볼까요?


로그인을 할때는 그냥 5글자 admin  / 1234(여러분이 정한 passwd값) 을 입력해 주시면 됩니다.





저는 이날 풀었다고 나오네용 하핳 


그러면 20000


검색어 유입 : webhacking.kr  webhacking.kr 2번  webhacking.kr 3번 webhacking.kr 5번 webhacking.kr  LnullVE


잘읽어 주셨으면 공감과 댓글... 공감만 해주셔도 감사하겠습니다. (로그인 필요 없어용)
















'워게임 > webhacking.kr' 카테고리의 다른 글

webhacking.kr 7번문제  (2) 2017.03.06
webhacking.kr 6번  (0) 2017.01.17
webhacking.kr 2번 (blind sql injection)  (0) 2016.02.28
webhacking.kr 4번  (0) 2016.02.04
webhacking.kr 3번  (0) 2016.02.01