티스토리 뷰

Wargame/Webhacking.kr

Challenge 5

do9dark 2015. 6. 27. 19:06


Login, Join 버튼이 있는 페이지를 볼 수 있고 Join 버튼을 누르면 아래와 같이 접근 거부 당한다.



메인 페이지 소스를 보면 스크립트로 Join 버튼을 누르면 다른 페이지로 이동하는 것이 아니라 단순히 Access_Denied 창을 띄운다는 것을 알 수 있다.



다른 정보를 얻기 위해서 로그인 페이지로 가면 아래와 같은 페이지를 볼 수 있다.



다른 페이지에 대한 정보를 얻기 위해서 디렉터리 리스팅을 해보면 아래와 같이 /hint 라는 정보와 함께 join.php가 있다는 것을 알 수 있다.



직접 join.php로 이동을 해보면 아래와 같은 페이지를 볼 수가 있다.



소스를 보면 아래와 같은 코드를 확인할 수 있다.



난독화되어 있는 코드를 아래와 같이 풀 수도 있다.


<html>
<title>Challenge 5</title></head><body bgcolor=black><center>
<script>
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='>';
abc=o+l+d+z+o+m+b+i+e;
abc2=d+o+c+u+m+e+n+t+.+c+o+o+k+i+e;
if(eval(abc2).indexOf(abc)==-1)
{
 bye;
}
if(eval(d+o+c+u+m+e+n+t+.+'U'+'R'+'L').indexOf(m+o+d+e+'='+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='+j+o+i+n+.+p+h+p+'>');
    document.write('<table border=1><tr><td><font color=gray>id</font></td><td><input type=text name='+i+d+' maxlength=5></td></tr>');
    document.write('<tr><td><font color=gray>pass</font></td><td><input type=text name='+p+w+' maxlength=10></td></tr>');
    document.write('<tr align=center><td colspan=2><input type=submit></td></tr></form></table>');
}
</script>
</body>
</html>
 
cs


코드를 보면 document.cookie 값 중에 oldzombie 라는 문자열이 없으면 if 문이 실행되어 bye; 가 되고 document.url 값 중에서 mode=1 이라는 문자열이 없으면 if문이 실행되어 access_denied 창과 함께 이전 페이지로 이동하게 된다.

그렇기 때문에 쿠키를 생성하여 oldzombie 라는 값과 join.php 페이지를 요청할 때 파라미터로 ?mode=1 를 입력하면 회원 가입할 수 있는 창을 볼 수 있다.



다른 방법으로는 아래 그림과 같이 두 가지 조건을 우회하고 실행되는 코드 부분을 직접적으로 실행하면 회원 가입할 수 있는 창을 볼 수 있다.




임의 계정을 생성해본다.



생성한 계정으로 로그인 해보면 아래와 같이 Access Denied! id is not admin 이라는 문자열을 볼 수 있다.

즉, 회원가입 페이지에서 우회를 통해 admin 계정으로 가입이 필요하다. 

(admin 계정으로 회원 가입 시 이미 있는 아이디라는 메시지와 함께 가입이 불가능하다.)

id 'admin' is already exists



코드를 보면 id 부분에 입력할 수 있는 글자 수가 5글자로 제한되어 있는 것을 볼 수 있고 이 부분을 간단하게 6글자로 늘린 다음 id에 'admin(공백)'으로 입력을 하면 sing up 이라는 메시지와 함께 계정이 생성된 것을 알 수 있다.



앞에서 임의 계정을 생성하였을 때와 다른 문구를 보여주는 것을 알 수 있다.



생성한 계정으로 로그인을 할 때 아이디는 공백없이 admin 으로 하고 패스워드는 생성한 값 do9dark 로 로그인 하면 우회해서 로그인할 수 있다.

이렇게 우회가 가능한 이유를 시도한 것을 바탕으로 추측을 해보면 데이터베이스에서 id 값이 10글자로 제한이 되어있어서 10글자 이상되는 문자는 삽입이 되지 않는 특징이 있고, id를 'admin ' (문자열 끝에 공백(trailing space))으로 입력하면 PHP에서는 'admin' 과 다르기 때문에 입력한 값이 데이터베이스에 삽입이 되고 로그인 시 데이터베이스에 저장된 값을 비교할 때에 id를 'admin' 으로 입력하면 데이터베이스에 저장되어 있는 'admin' 과 'admin '이 비교 조건에 만족하기 때문에 우회하기 위해 삽입한 password를 입력하면 admin으로 우회할 수 있다.


All MySQL collations are of type PADSPACE. This means that all CHAR, VARCHAR, and TEXT values in MySQL are compared without regard to any trailing spaces.








'Wargame > Webhacking.kr' 카테고리의 다른 글

Challenge 11  (0) 2015.07.06
Challenge 10  (0) 2015.07.06
Challenge 9  (0) 2015.07.05
Challenge 8  (0) 2015.07.05
Challenge 7  (0) 2015.07.05
Challenge 6  (0) 2015.06.28
Challenge 4  (0) 2015.06.25
Challenge 3  (0) 2015.06.25
Challenge 2  (0) 2015.06.18
Challenge 1  (0) 2015.06.18
댓글
«   2024/03   »
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
링크
공지사항
Total
Today
Yesterday