Blind SQL Injection와 같은 공격 기법은 임의 데이터를 알아내기 위한 일련의 방법으로 수많은 쿼리를 전송한다. 실제로 애플리케이션을 공격할 때에 수많은 쿼리를 전송하게 되면 방화벽에 의해 접속 IP가 차단될 수 있다. 이 뿐만 아니라 알아내려는 데이터의 길이가 길면 길수록 실행해야 할 쿼리 또한 늘어나며 그만큼 공격에 들이는 시간이 길어질 수 밖에 없다.
그렇다면 Blind SQL Injection을 통해 데이터베이스의 내용을 효율적으로 알아내려면 어떤 방법이 있을까?
**이진 탐색(Binary Search)**은 이미 정렬된 리스트에서 임의의 값을 효율적으로 찾기 위한 알고리즘이다. 해당 알고리즘은 임의 값을 찾기 위해 검색 범위를 좁혀나간다. 검색 과정은 아래와 같이 이뤄진다.
Binary Search 사용 예시
데이터베이스가 아래와 같이 구성되어 있다고 가정해보자.
| username | password |
|---|---|
| admin | P@ssword |
Binary Search를 이용한 공격
Blind SQL Injection에서 사용한 substr 함수의 반환 값을 비교하여 패스워드를 알아낼 수 있다. 공격하기에 앞서 비밀번호에 포함될 수 있는 아스키에서 출력 가능한 문자의 범위는 32 ~ 126이므로 패스워드의 첫 번째 바이트가 79보다 큰 값인지 확인한다. 아래는 비밀번호의 첫 번째 자리가 79보다 큰 값인지 비교하는 쿼리를 실행한 모습이다.