안녕하세요? 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안으로 들어가 봐야 겠습니다.
이런식으로 아무것도 안올라 와있는것을 확인할수 있습니다.
음... 소스코드를 확인해 봅시다.
흐흫...
요상한 스크립트가 하나 있네요... 우선 암호화를 하고 있습니다.
우선 선언문까지만 다시 콘솔에 입력해 보겠습니다.
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 가 나오게 됩니다. 그러면 다음 조건문을 봐야겠지요...
+'>');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 |