펌해옴 : http://kcats.tistory.com/121


The_basic_of_Blind_SQL_Injection_PRIDE.pdf

blind_sql_injection-mysql_5.pdf



이 포스팅은 위 2개의 파일을 읽고 blind sql injection 에 대해 정리한 글이다.


저작권에 문제가 된다면 바로 삭제할겟습니다!


일반적인 sql injection은 웹 시스템이 쿼리를 이용하여 데이터베이스를 조회하는 과정을 


우회하는 방법이다.




▲ 서버에서 요청하는 입력 폼



blind sql injection은 다음과 같은 특정한 상황에서 사용 가능하다.

1. 쿼리문으로 참과 거짓 일때의 서버의 반응을 알 수 있어야 함

2. 원하는 결과를 얻을 데이터베이스의 이름을 알 수 있어야 함


이러한 상황일때  쿼리 문의 asciilimitsubstr 등의 구문을 이용한다.

하나하나 살펴보도록 하자.


먼저, ascii는 ascii(문자) 를 하였을때 해당 문자의 아스키코드를 반환한다. 

이에 대한 자세한 설명은 아래의 링크에 있다.

http://www.w3resource.com/mysql/string-functions/mysql-ascii-function.php

풀어 설명하자면, ascii(a)를 하면 a의 아스키코드인 숫자  97이 반환된다

아스키코드표 링크



둘째, limit은 출력의 개수를 제한할 수 있는 함수다.

limit 200 이라고 하면 출력 개수를 최대 200개로 제한한다는 것이고

limit 2,10 이라고 하면 두번째 행부터 10행까지만 출력한다는 것이다.

http://www.razorsql.com/articles/mysql_limit_query.html


셋째, substr은 특정 문자열을 원하는 만큼 자를 수 있다. 사용법으로는

 substr(문자열, 문자열에서 자르고자 하는 문자열의 처음 위치, 자르고자 하는 문자열의 길이이다.

http://www.w3resource.com/mysql/string-functions/mysql-substr-function.php








substr, ascii(), limit을 이용하는 것을 토대로 이제는 실전적으로 가보겠다.


INFORMATION_SCHEMA

MYSQL에서 데이터베이스에 대한 메타데이터를 제공하는 스키마이다.

출처 : http://mysqldba.tistory.com/52


INFORMATION_SCHEMA가 가지고 있는 정보를 이용하여야 한다. 이 테이블은 여러 정보를 가지고 있는데 그 중에서도 대표적으로 TABLES 와 COLUMNS이 유용한 정보를 많이 가지고 있다.



위의 그림에서 보는것과 같이 테이블을 만들면 기본적으로 TABLE_TYPE이 BASE_TABLE로 설정되므로 이를 이용하여 쿼리문을 만들수 있다. 쿼리문은 다음과 같다.


select TABLE_NAME from INFORMATION_SCHEMA.TABLES 

where TABLE_TYPE = 'base type' 

라고 쿼리를 입력하면 위의 TABLES의 쿼리와 비슷하게 나올것이다.

( 일단 저기에는 BASE_TABLE외의 다른 타입이 없다) 


여기에 저번 포스팅에서 배운 LIMIT을 사용하면 

select TABLE_NAME from INFORMATION_SCHEMA.TABLES 

where TABLE_TYPE = 'base type'  LIMIT 0,1

라고 쿼리를 입력하면 테이블에서 가장 위의 있는 값인  spt_fallback_db가 나올것이다.


그리고 substr을 사용하면

substr((select TABLE_NAME from INFORMATION_SCHEMA.TABLES 

where TABLE_TYPE = 'base type'  LIMIT 0,1),1,1))   

라고 쿼리를 입력하면 테이블에서 가장 위의 있는 값인  spt_fallback_db에서 가장 첫번째 문자인 's'가 나올 것이다.


마지막으로 ascii()함수를 이용하면

ascii(substr((select TABLE_NAME from INFORMATION_SCHEMA.TABLES 

where TABLE_TYPE = 'base type'  LIMIT 0,1),1,1))

라고 쿼리를 입력하면 테이블에서 가장 위의 있는 값인  spt_fallback_db에서 가장 첫번째 문자인 's'의 아스키코드인 115가 나올것이다.


이에 대한 응용으로 빠르게 아스키코드를 찾기 위해서는 

ascii(substr((select TABLE_NAME from INFORMATION_SCHEMA.TABLES 

where TABLE_TYPE = 'base type'  LIMIT 0,1),1,1)) < 115

이 값이 참이라고 판정된다면 TABLES에 있는 base_type의 첫번쨰 테이블 이름의 첫문자는 s보다 앞에 문자라는 것을 알 수 있다. 

하지만 이렇게 찾으려면 문자열이 길다면 많은 시간이 소모될 것을 알 수 있다. 그러므로 blind sql injection을 대신 해줄 툴을 사용하거나 자신이 직접 코딩하여 만들어서 사용하기를 추천한다.

툴을 정리해둔 포스팅 링크

정리하자면

1. 참과 거짓을 알 수 있는 상황이 있어야함

2. 많은 시간이 걸릴수 있으므로 툴을 사용



'SQL Injection' 카테고리의 다른 글

sql injection 툴  (0) 2017.02.28
Posted by wakira
,