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가 난독화 되어 있는 것을 확인 할 수 있다.
우선, 난독화를 복호화할 수 있는 사이트에 들어가보자.
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' 으로 재가입해보니 가입이 정상적으로 이루어졌다.
이 후 로그인이 정상적으로 되는 것을 볼 수 있다.
'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 |