웹 해킹&보안/SQLInjection

SQL Injection

cyanhe_wh 2019. 9. 3. 23:41
반응형

SQL Injection

웹 페이지의 입력 또는 매개변수인 파라미터의 값에 SQL 쿼리를 주입하여 데이터베이스의 데이터 조작이 가능한 웹 해킹 기법 중 하나이다.

이 취약점은 데이터베이스와 웹 애플리케이션이 연동되면서 태생되었으며 허용된 권한, 기능, 실행 가능한 SQL 쿼리에 의해서 피해 정도가 가늠되는 취약점이다.

 

SQL Query

이 취약점은 DB의 데이터를 질의하기 위한 SQL 쿼리가 핵심 공격 기술에 해당되고, SQL 쿼리 구문 구현 능력이 공격 능력을 좌우한다고 할 수 있다.

SQL은 데이터베이스로부터 정보를 얻거나 갱신하기 위한 표준 대화식 프로그래밍 언어이다.

 

데이터 조작어(DML) : 스키마 객체 내에서 데이터를 관리한다.

                             ex) select, insert, update, delete 등

데이터 정의어(DDL) : 데이터베이스 구조 또는 스키마를 정의한다.

                             ex) create, alter, drop 등

데이터 제어어(DCL) : 데이터 액세스 권한을 설정한다.

                             ex) GRAN, DENY, REVOKE 등

트랜잭션 처리어(TCL) : 트랜잭션 관련 처리를 수행한다.

                             ex) COMMIT, ROLLBACK 등


MySQL : 스키마 객체 => information_schema

 

select table_name from information_schema.tables

데이터베이스의 스키마 tables 객체에서 테이블 명 조회

테이블 타입조회는 => select table_type from information_schema.tables

두 개를 조합해 select table_name, table_type from information_schema.tables

 

테이블 타입을 보면 3가지가 있다.

BASE TABLE      => 일반적인 테이블

VIEW               => 뷰

SYSTEM VIEW    => information_schema 테이블

SYSTEM VIEW는 DB를 관리하기 위한 데이터가 저장되기 때문에 정보 획득에는 불필요하다.

 

정보 획득에 꼭 필요한 BASE TABLE만 조회 방법

select table_name from information_schema.tables where table_type='base table'

 

SQL 인젝션 공격 기법은 제한된 환경에서 공격을 수행하기 때문에 꼭 필요한 데이터만 효율적으로 찾는 방법을 고려해야 한다. 그중 하나가 불필요한 테이블을 배제하는 것이다.

 

칼럼 정보 조회가 가능한 columns 객체에 대해서 학습한다.

columns 객체는 where 절에 특정 table_name을 지정하지 않을 경우 전체 칼럼의 정보가 조회된다.

데이터베이스는 칼럼의 데이터 타입도 매우 중요하며 데이터 유형을 알지 못할 경우 데이터 획득이 어려움이 발생할 수 있다.

ex) select column_name, data_type from information_schema.columns where table_name='Employees'

 

테이블 조회에서는 꼭 알아야 할 사항으로 table_type, 칼럼에서는 data_type 이다.


MSSQL(Microsoft SQL Server의 약자로 SQL Server 로도 불린다.

SQL Server는 information_schema와 sys.objects, sys.columns 객체에서 테이블과 칼럼의 목록 조회가 가능하다.

 

칼럼

tables(information_schema) : 현재 데이터베이스에서 현재 사용자가 액세스 할 수 있는 테이블 정보

columns(information_schema) : 현재 데이터베이스에서 현재 사용자가 액세스 할 수 있는 칼럼의 정보

sys.objects : 고유하게 컴파일된 스칼라 사용자 정의 함수를 포함하는 데이터베이스 내에서 만든

                 각 사용자 정의 스키마 범위 객체에 대한 행

sys.columns : 뷰 또는 테이블과 같이 열을 갖고 있는 개체의 각 열에 대한 행.

                  열을 갖고 있는 개체 형식의 목록

  • 테이블 반환 어셈블리 함수(FT)
  • 인라인 테이블 반환 SQL 함수(IF)
  • 내부 테이블(IT)
  • 시스템 테이블(S)
  • 테이블 반환 SQL 함수(TF)
  • 사용자 테이블(U)
  • 뷰(V)

불필요한 system view와 view 테이블을 제외하고 일반 테이블인 base table의 정보만 조회

seleselect table_name from information_schema.tables where table_type='base table'

 

Employees 테이블의 칼럼 정보와 데이터 유형 조회

selectselect column_name, data_type from information_schema.columns where table_name='Employees'

 

SYSTEM VIEW를 통한 조회

또 다른 방식으로 SQL Server에서 제공하는 시스템 카탈로그 뷰로 sys.objects와 sys.columns를 이용하여 테이블과 칼럼의 목록을 조회하는 방법이다.

테이블 명은 sys.objects의 칼럼 name에 해당한다.

스키마 정보 테이블에서와 같이 시스템 테이블 등 다양한 추가적인 테이블이 조회되기 때문에 sys.objects에서는 type이 u인 테이블만 조회한다.

type u는 사용자 정의 테이블을 의미하며 앞으로 학습한 base table에 해당한다.

 

select name from sys.objects where type='u'

 

시스템 카탈로그 뷰를 통한 칼럼 조회는 객체 식별을 위한 객체 번호가 필요하다.

객체 번호 조회는 object_id 칼럼을 추가한다.

select name, object_id from sys.objects where type='u'

 

칼럼 명은 sys.columns 테이블의 name에 해당한다. 

 

테이블 명이 아닌 객체 번호를 이용하여 칼럼의 목록을 조회

select name from sys.columns where object_id=949578421

 

sys.columns에서 칼럼의 데이터 타입은 user_type_id를 통해 조회

select name, user_type_id from sys.columns where object_id=949578421

 

유형명으로 확인 가능하도록 type_name 변환 함수 이용

select name, type_name(user_type_id) from sys.columns where object_id=949578421

 

시스템 뷰를 이용한 방법은 테이블 명으로 칼럼 명 조회가 불가하고 object_id를 추가로 획득해야 한다.

SQL 인젝션 공격 기법에 따라서는 매우 번거로운 작업이 될 수 있지만, SQL 쿼리의 자가 조인 문을 이용하면 테이블 명을 이용하여 칼럼 명 조회가 가능하다.

select col.name, type_name(col.user_type_id) from sys.columns col, sys.objects obj where col.object_id=obj.object_id and obj.name='Employees'


Oracle 데이터베이스

데이블과 칼럼 조회는 MySQL과 SQL Server와는 상이한 방식으로 데이블과 칼럼 정보를 제공하고 있다.

 

테이블 정보 조회가 가능한 스키마 객체

all_tables : 현재 사용자가 접근할 수 있는 모든 테이블에 관한 정보

user_tables : 현재 사용자 소유의 관계형 테이블에 관한 정보    (tabs 동의어)

dba_tables : 모든 데이터베이스 내의 관계형 테이블에 관한 정보

 

테이블 명이 표기되는 칼럼은 table_name이다.

select table_name from tabs

 

칼럼 정보 조회 가능한 스키마 객체

all_tab_columns : 현재 사용자가 접근할 수 있는 모든 테이블, 뷰, 클러스터에 대한 칼럼 정보

user_tab_columns : 현재 사용자 소유의 모든 테이블, 뷰, 클러스터에 대한 칼럼 정보   (cols 동의어)

dba_tab_columns : 모든 테이블, 뷰, 클러스터에 대한 칼럼 정보

 

cols의 칼럼 명은 column_name이며 table_name 칼럼을 제공하고 있기 때문에 조건문에서 테이블 명 사용이 가능하다.

select column_name from cols where table_name='employees'

 

반응형

'웹 해킹&보안 > SQLInjection' 카테고리의 다른 글

SQL Injection (UNION)  (0) 2019.09.05