1. Blind SQL Injection 개념

쿼리 결과로 나오는 참, 거짓을 이용하여 DB의 정보를 취득하고자 하는 기법이다.

DB가 SQL Injection에 대응되어 있는 경우에 참, 거짓을 구분할 수 있는 SQL문을 이용하여 데이터를 알아내는 기법이다.


2. 특징

숫자 형태의 데이터까지 파악할 수 있다.

프록시 도구를 이용하거나 소스를 수정하여 SQL Injection 대응 체계를 우회할 수 있다.


3. 종류

3-1. 추론 기법에 의한 공격

3-1-1. Time 기반

sleep() 이나 롱 쿼리를 이용하여 시간 지연을 발생시킨다.

3-2-2. Response 기반

기존 쿼리에 다른 구문이 추가되거나 추론값에 의해 아무런 결과를 출력하지 않을 수 있다.

3-2. 외부 대역 채널 공격

사용 가능한 외부 대역 채널을 이용하여 많은 양의 정보를 직접 추출한다.


4. 함수

몇가지 기본적인 함수를 알고 있어야 한다.

4-1. substr

문자열을 자를 때 사용하는 함수이다. 시스템 버전을 알아내야 하는데 예를 들어 MySQL의 메이저 버전을 찾기 위해 사용한다. substring(@@version,1,1) 하면 4인지 5인지 알 수 있게 된다.

4-2. ascii

문자의 아스키 값을 리턴하는 함수이다.


5. 예제

5-1. 소스 코드

[ bbs.php ]

<?php

$db = mysql_connect( 'localhost', 'root', '12345' );
mysql_select_db( 'blind', $db );

$sql = "SELECT * FROM bbs WHERE no={$_GET[no]}";

if( $ret ){
  print "This is BBS<br>";
  while( $row = mysql_fetch_row( $ret ) ) {
    print "Subject: $row[1] <br>";
    print "Content: $row[2] <br>";
  }
}

?>

5-2. 실행

  • http://127.0.0.1/bbs.php?no=10
  • http://127.0.0.1/bbs.php?no=10%20test
  • -> SELECT * FROM news WHERE no=1 test