728x90
반응형

300점인 5번 문제를 풀어보도록 하자.

첫 화면은 Login과 Join 버튼만 나와있다.

Join 버튼을 누르게 되면 'Access_Denied' alert창이 뜨게 되고

Loing 버튼을 눌러 나타나는 id과 pw에 Injection을 시도해봤으나 별다른 반응은 없었다.

개발자 모드로 진입해서 소스코드를 살펴보자.

login페이지로 넘어가는 경로를 확인해보니 mem/login.php로 이동하는 걸 확인할 수 있으므로, Directory Listing을 시도해보자.

login.php 이외에 join.php 페이지가 존재하는 것을 확인할 수 있다.

join.php 페이지로 이동해보면 'bye'문구가 적혀있는 alert창이 뜨게 된다.

join.php의 소스코드를 확인해보면 javascript가 난독화 되어 있는 것을 확인 할 수 있다.

우선, 난독화를 복호화할 수 있는 사이트에 들어가보자.

https://beautifier.io/

 

Online JavaScript beautifier

 

beautifier.io

복호화된 코드는 아래와 같다.

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 > ');
                    }

변수들을 하나씩 검색하여 코드를 변환시켜보자.

if (eval(document.cookie).indexOf(oldzombie) == -1) {
                bye;
            }
            if (eval(document.URL).indexOf(mode=1) == -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=join.php>
                    '>');
                document.write('<table border=1><tr><td><font color=gray>id</font></td><td><input type=text name=id maxlength=5></td></tr>');
                document.write('<tr><td><font color=gray>pass</font></td><td><input type=text name=pw maxlength=10></td></tr>');
                document.write('<tr align=center><td colspan=2><input type=submit></td></tr></form></table>');
            }

 

복호화된 코드의 조건문을 살펴보면 우리가 확인할 수 있는 부분은 2가지가 있다.

1) cookie값이 oldzombie가 존재하지 않으면 bye가 된다.

2) URL에 mode=1이 존재하지 않으면 'access_denied' alert창이 뜨고 페이지 뒤로가기가 된다.

 

cookie 명을 oldzombie로 만든 후, mode=1을 인자값으로 재전송하게 되면 새로운 화면이 보이게 된다.

id와 pw를 임의로 1234로 가입하고 로그인을 시도해 보았지만 admin계정으로 로그인하라는 메시지를 확인할 수 있다.

admin으로 가입 시도해봤지만 이미 존재하는 계정이라고 확인된다.

join.php의 id부분의 코드를 확인해보면 id의 maxlength값이 20으로 되어있는 걸 알 수 있다.

이 부분을 6으로 바꾸고 ' admin' 으로 재가입해보니 가입이 정상적으로 이루어졌다.

이 후 로그인이 정상적으로 되는 것을 볼 수 있다.

 

728x90
반응형

'CTF & WarGame > webhacking.kr' 카테고리의 다른 글

[webhacking.kr] 7번 문제  (0) 2020.02.28
[webhacking.kr] 6번 문제  (0) 2020.02.27
[webhacking.kr] 4번 문제  (0) 2020.02.25
[webhacking.kr] 3번 문제  (0) 2020.02.25
[webhacking.kr] 2번 문제  (0) 2020.02.21

+ Recent posts