펌해옴 : 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. 원하는 결과를 얻을 데이터베이스의 이름을 알 수 있어야 함
이러한 상황일때 쿼리 문의 ascii, limit, substr 등의 구문을 이용한다.
하나하나 살펴보도록 하자.
먼저, 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가 가지고 있는 정보를 이용하여야 한다. 이 테이블은 여러 정보를 가지고 있는데 그 중에서도 대표적으로 TABLES 와 COLUMNS이 유용한 정보를 많이 가지고 있다.
COLUMNS과 TABLES
▲COLUMNS
▲TABLES
위의 그림에서 보는것과 같이 테이블을 만들면 기본적으로 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 |
---|