kangsecu's B1og

[webhacking.kr] pro 5 문제풀이 본문

Web Hacking/webhakcing.kr

[webhacking.kr] pro 5 문제풀이

Kangsecu 2018. 2. 22. 02:17

[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
= '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';
= '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!