문제에 접속하면 위와같은 화면을 보게된다.

Join 은 접속할 수 없고


Login 을 누르면 다음과 같은 화면이 나온다.



아무렇게나 로그인을 해보자



이렇게 admin 으로 로그인을 해야한다고 말해준다.


join 에도 무언가가 있을것 같은데,

join 은 접속할 수가없다.


그런데 우리가 Login의 주소를 보면 알겠지만

/mem/login.php

정말 정직한 주소이다.

/mem/join.php

로 접속을 해보자


Not Found 가 뜨지 않고

접속이 된다. 그런데 검정 화면만이 자리잡고있다.


소스보기를 한번 해보자


소스를 보게되면 알아보기가 힘들게 난독화가 되어있다.

이 소스를 jsbeautifuler 와 같은 툴을 통해 살펴보면

어떠한 조건에 따라 조건이 맞을 경우 페이지 요소들을 보여주게 되어있다.


여기서 우리가 조건문을 통과하는 방법은 두가지가있다.

1. 조건을 맞춘다.

2. 조건을 무시하고 조건내에 있는 실행문을 실행시킨다.


클라이언트 기반 웹은 재밌게도 2번이 가능하다.

javascript 는 소스를 클라이언트 내에서 실행시키기 때문에, 소스를 조작할 수도 있고

위와 같이 소스를 볼 수 있기 때문에 조건문을 무시하고 조건문 내부에 있는 소스를 긁어다가 실행시킬수도있다.


필자는 2번을 사용하여 문제를 풀이하겠다.


join.php 페이지에서 개발자도구 를 켜서

난독화된 소스의 조건문 내 실행문만 긁어서 콘솔에서 실행시키면 된다.


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

}

난독화된 소스를 보기 편하게 정리하면 위와같이 정리되는데

필자가 빨간색으로 칠해놓은 부분이 실제 조건을 맞추면 실행되는 부분이다.

이부분들을 복사하여 개발자 도구의 콘솔에서 실행시켜보자



위와 같이 실행이 된다.

실행 후 띄어놓은 join.php 를 보면

화면이 바뀌어 있는걸 볼 수 있다.




가입 창이 생겼다.


우리는 admin 으로 로그인을 해야하기 때문에 admin으로 가입을 할 것이다.

그런데 admin으로 가입이 되지않는다.



admin 은 이미 아이디가 있다.

그럼 admin은 아닌데 admin으로 로그인이 될 수 있는 아이디가 되어야 하는데

필자는 admin 맨뒤에 space를 한번 주어서 해결했다.

(trim 을 사용하거나 하여 공백을 무시할것으로 추측)

admin%20

이 되겠다.

파로스로 중간에서 조작해 주어도 되고,

가입할때 'admin ' 으로 가입해도 된다.

그런데 가입할때 input의 max-length 가 5 라서 입력이 안되는데,

이부분은 개발자 도구로 제한을 풀어주면 쉽게 해결된다.



위처럼 maxlength 를 6보다 크게 지정한뒤

'admin ' 아이디로 가입을 해보자





이제 가입한대로

로그인을 해보자

/mem/login.php



이렇게 로그인을 하면

문제를 해결하게된다.


'Security > Wargame' 카테고리의 다른 글

[Webhacking.kr] Challenge 7  (0) 2014.10.07
[Webhacking.kr] Challenge 6  (0) 2014.10.07
[Webhacking.kr] Challenge 5  (0) 2014.07.10
[Webhacking.kr] Challenge 4  (0) 2014.07.10
[Webhacking.kr] Challenge 3  (0) 2014.06.19
[Webhacking.kr] Challenge 2  (5) 2014.06.17

티스토리 툴바