티스토리 뷰
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 |