[그림 01] 시작 화면


[그림 01]과 같은 화면을 시작 화면으로 볼 수 있을 것입니다.

[그림 02]는 login, [그림 03]은 join을 눌렀을 때의 상태를 보여줍니다.

[그림 02] join을 눌렀을 때의 화면

[그림 03] join을 눌렀을 때의 화면


[그림 03]처럼 join을 눌렀을 때의 화면이 나오는 이유는 Javascript를 이용하여 그냥 alert('Access_Denied')로 돼 있어서 입니다.

즉, link가 따로 없습니다.

그렇다면 다른 방향으로 접근해야 합니다.

이 사이트에서 각 문제는 하위 디렉토리로 구성되는 것을 익히 아실거라 생각합니다. [그림 04]를 참고해주십시오.

[그림 04] 디렉토리 구성을 알려주는 주소


[Directory, web]->[Directory, web-05]->[Directory, mem]->[File, login.php]입니다.

web이라는 디렉토리 하위의 web-05 하위의 mem 하위의 login.php라는 PHP파일을 브라우저를 통해 보여주는 형식입니다.

그럼 우리는 login을 들어가면 login.php이니, join은 혹시 join.php가 아닐까 하는 느낌을 받을 수 있지 않을까 합니다.


이제 login.php를 바꿔 join.php로 들어가봅니다.


join.php로 들어가면 다음과 같이 난독화가 되어있는 것을 알 수 있습니다.


Challenge5


이와 같이 난독화 되어 있는 코드를 python 코드로 간단하게 작성하여 디코드해보았습니다.

아래와 같이 난독화가 풀어지는 것을 확인할 수 있습니다.


l1'b'1'b'1'b'1'b'1'b'1'b'1'b'1'b'1'b'1l='o'+'l'+'d'+'z'+'o'+'m'+'b'+'i'+'e'

l08l='d'+'o'+'c'+'u'+'m'+'e'+'n'+'t'+.+'c'+'o'+'o'+'k'+'i'+'e'
if(eval(l08l).indexOf(l1'b'1'b'1'b'1'b'1'b'1'b'1'b'1'b'1'b'1l)==-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('Join

'); document.write('.

.

.

.

.

'); document.write('

'); document.write(''); document.write(''); document.write('
id
pass
'); }

이 코드를 보니 document.write로 되어 있는 부분은 화면에 다른 소스를 입력하기 위한 창으로 볼 수 있고, 그 위에는 그 화면으로 접근하기 위한 방법으로 알 수 있습니다.

대충 요약하면 조건 두 가지가 나옵니다.▼


조건 1. 쿠키에 oldzombie 라는 이 있어야 합니다.

조건 2. URL에 ?mode=1이 있어야 합니다.


[그림 05] 완성된 화면


id에 admin이라고 입력하면 'admin is already exist'라는 문자가 뜨고, 나머지는 'Done! 뭐시기 뭐시기'가 뜹니다.

그런데, admin 이외의 다른 계정을 계속 생성해도 Done이 되는 걸 보니 DB에 INSERT가 허용되는 것으로 확인할 수 있습니다.


admin을 어떻게 덮어쓰기 위해서는 DataBase에서는 삭제되고, 쿼리는 admin이 아니게 전송할 수 있는 문자열이 필요합니다.


SQL에서는 trim()이라는 함수가 존재합니다. 구문에서 띄어쓰기를 삭제하는 함수입니다.

예를 들면 id 컬럼에 'admin   1', 'admin        1'이라는 값을 입력하여 차례대로 생성해보면,

1. admin1이 생성되었습니다.

2. admin1이 이미 있습니다.(중복 에러)

라고 뜹니다.


띄어쓰기는 삭제되는 것을 볼 수 있습니다.


id에 'admin '을 입력하고 원하는 비밀번호를 입력하면 Done이 뜨고, login.php로 들어가 로그인을 하게 되면 성공입니다.




참고 소스(Python) - 난독화를 대충이라도 디코딩 및 프린트 하기:

string_a = """

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('Join

'); document.write('.

.

.

.

.

'); document.write('

'); document.write(''); document.write(''); document.write('
id
pass
'); }""" for i in range(26,1,-1): string_a = string_a.replace('l'*i,"'"+chr(ord('z')-(26-i))+"'") for i in range(10,0,-1): if i == 10: string_a = string_a.replace('I'*i,'0') else: string_a = string_a.replace('I'*i,str(i)) string_a = string_a.replace('li', '.') string_a = string_a.replace('ii', '<') string_a = string_a.replace('iii', '>') print string_a


'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No.15(50) - old  (0) 2016.06.28
Webhacking.kr_No.14(100) - old  (0) 2016.06.28
Webhacking.kr_No.12(250) - old  (0) 2016.06.28
Webhacking.kr_No.10(250) - old  (0) 2016.06.28
Webhacking.kr_No.06(100) - old  (0) 2016.06.28
Webhacking.kr_No.04(150) - old  (0) 2016.06.22
Webhacking.kr_No.03(350) - old  (0) 2016.06.16
Webhacking.kr_No.01(200) - old  (0) 2016.06.16

+ Recent posts