Self-Improvement

블라인드 SQLi(순차, 이진, 사전 검색) 본문

SQLi

블라인드 SQLi(순차, 이진, 사전 검색)

JoGeun 2020. 4. 21. 15:13

순차검색 기법

순차 탐색기법은 선형 검색으로 불리며 명칭에서도 알 수 있듯이 자료를 처음부터 순차적으로 검색하는 단순한 기법이다.

해당 기법에서는 SUBSTR(), SUBSTRING() 함수를 주로 사용한다.

SUBSTR(), SUBSTRING() 함수에 From for을 사용할 수 도 있다.

select substr('johyun',3)

select substr('johyun' from 3)

select substr('johyu' from 3 for 2)

select substr('johyun' from -2 for 2)

 

예시로 데이터 값이 "johyun"으로 되어 있다고 보고 substr(), ascii() 함수를 이용하여 순차 탐색 기법을 이용해본다.

select substr('johyun' from 1 for 1)=char(106)

or

select substr('joselect ascii(substr('johyun' from 1 for 1))=106

위와 같이 한글자씩 유추하고 추출해내는 방식으로 알파벳, 숫자, 특수문자 등의 각 값을 비교해야 함으로 5글자를 얻어낼려면 총 526번의 요청이 필요하는 노가다가 필요한 기법이다.

 

이진검색 기법

이진검색은 정렬된 리스트에서 중앙 값을 선택하고 해당 값 보다 큰지 작은지 비교해서 데이터를 검색하는 방식이다.

순차 검색 기법에서 예시를 든 'johyun' 데이터를 다시 확인해본다.

select ascii(substr('johyun' from 1 for 1))<107

or

select substr('johyun' from 1 for 1)<char(107)

 

이러한 방식이 이진검색 기법이며 순차검색보다 효율성이 좋다.

 

 

사전검색 기법

순차검색과 이진검색 알고리즘은 테이블과 칼럼 명 스키마 객체를 조회할 때 사용이 가능한 기법이다.

하지만 데이터베이스에서 스키마 객체 조회 수단을 제공하지 않을 경우 테이블과 칼럼의 객체명을 알 수 없기 때문에 SQLi 치약점이 발생하더라도 데이터 획득은 불가능하다. 이렇게 스키마 객체를 통한 조회 기능을 제공하지 않거나 차단되어 있는 경우에 사용이 가능한 검색 방법이다.

 

사전검색은 DB에 어떤 테이블이 있는지 알 수 없기 때문에 가능성이 높은 테이블은 리스트화 해서 하나씩 SQL 쿼리로 대입해 보는 방법이다.

(select  count(*) from <word>)>0

위와 같은 쿼리 방식으로 특정 테이블이 1개 이상 존재하면 참 명제가 되어 존재 유무를 알 수 있다.

 

동일한 방식과 CASE 구문을 이용하여 member 테이블이 존재하는지 검색해본다

select case when (select count(*) from member)>0 then 1 else 0 end

member 테이블이 존재하지 않기 때문에 거짓 명제가 되어 오류가 발생한다.

 

이번에는 Employees 테이블이 존재하는지 검색해본다.

select case when (select count(*) from Employees)>0 then 1 else 0 end

Employees 테이블은 존재하기 때문에 참 명제가 되어 1이 출력된다.

 

이러한 스키마 객체 뷰를 제공하지 않는 환경에서 테이블 및 칼럼의 목록 획득이 가능한 사전검색 기법이었다.