[webhacking.kr] pro 5 문제풀이
[webhacking.kr] pro 5 문제를 풀어보도록 하겠습니다.
문제에 들어가면 이렇게 login버튼과 join버튼이 있습니다.
그런데 join버튼을 눌러보니 접근을 제한했습니다.
그래서 코드를 봤더니 mem디렉터리에 좋은게 있다고 합니다. 그래서 mem디렉터리에 접속을 했습니다.
이렇게 내용들을 볼 수 있습니다. 여기서 join.php에 들어가봤더니 아무것도 없이 black out되있는 화면이 출력됬습니다. 그래서 역시 코드를 확인해보니
아래 사진과 같이 더럽게 난독화가 된 javascript코드가 있었습니다.
이걸 beautify를 돌렸습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | 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; } 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); } 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>'); } | cs |
더럽기는 마찬가지입니다. 이제 여기서 값을 하나하나 치환해서 코드를 이해했습니다. 사진은 아쉽게도 없습니다.
Exploit Vector
난독화된 코드를 해석해보면, cookie name에 oldombie가 있어야하며, GET방식으로 파라미터로 mode=1을 전송한후, admin으로 로그인 해야합니다.
Exploit
이렇게 oldzombie를 만들었습니다.
이렇게 mode=1파라미터를 전달했습니다. 그랬더니 아무것도 없던 웹에서 로그인폼이 나타났습니다.
그래서 admin을 입력하고 제출을 했는데, 이미 존재하는 계정이라고 합니다. 그래서 어떻게해야하나 생각을 하던중, id값을 5글자만 받아서 폼에서도 5글자밖에 입력이 안되는걸 보고 ' 아 이걸 10글자로 바끄고 admin뒤에 공백을 넣고 전송해도 서버단에선 앞에 5글자만 받겠구나' 하고 생각했습니다. 그래서 입력길이 제한을 10글자로 바꿨습니다.
그리고 이제 admin뒤에 space를 붙혀서 공백을 만들어줍니다. 아래 사진에선 공백을 보여줄 방법으로 %20을 입력하였습니다.
이렇게 제출을 하면 sign up이 뜨며 가입이 됩니다. 그럼 이제 login.php로 돌아갑니다.
이렇게 입력을 해주면 문제가 해결됩니다.
[webhacking.kr] pro 5 Clear!