Hacking/Web

Oracle 을 통해 JAVA 코드 사용

rootable 2018. 2. 5. 13:36
반응형

0. 주제선정

 - https://www.adampalmer.me/iodigitalsec/2013/08/12/first-steps-in-oracle-penetration-testing/ 하단을 보면 ORACLE 내에서 JAVA 코드를 작성할 수 있는 것이 보였다.

 - 해당 주제에 대해 공부하며 ORACLE에 대해 조금 더 알 수 있을까 하여 시작하였다.


1. PL/SQL

- ORACLE 내에서 JAVA 코드를 사용하기 위해서는 PL/SQL을 통해서 권한을 부여해주어야 한다. 이를 위해 먼저 PL/SQL을 알아보자.


 1.1 PL/SQL이란?

 - 오라클 DBMS에서 SQL 언어를 확장하기 위해 사용하는 컴퓨터 프로그래밍 언어 중 하나 ( 오라클 DBMS의 경우 버전 7부터 가능)


 1.2 구조

DECLARE

변수 선언문;

BEGIN

프로그램 코드;

EXCEPTION

예외 처리문;

END;


 1.3 예제

DECLARE

X NUMBER;    // 숫자형 변수 선언

BEGIN

x := 100;        // 해당 변수에 값 100 대입

END;

/


 1.4 권한

 - PL/SQL을 실행하기 위한 필요권한은 없다. (계정 생성 후 DB에 접근하기 위한 [ CREATE SESSION ] 권한만 주어주고 시도해본 결과 PL/SQL 프로시저를 성공적으로 완료하였다.


2. 권한 부여

 - PL/SQL에 대해 간단히 알아보았다. 이를 토대로 JAVA 코드를 ORACLE 데이터베이스에서 작성할 수 있도록 권한을 부여하는 PL/SQL 코드를 보자.


DECLARE

  l_schema VARCHAR2(30) := 'SYSTEM';

BEGIN

  DBMS_JAVA.grant_permission(l_schema, 'java.io.FilePermission', '<<ALL FILES>>', 'read ,write, execute, delete');

  DBMS_JAVA.grant_permission(l_schema, 'SYS:java.lang.RuntimePermission', 'writeFileDescriptor', '');

  DBMS_JAVA.grant_permission(l_schema, 'SYS:java.lang.RuntimePermission', 'readFileDescriptor', '');

END;

/


① 변수를 선언해주기 위한 변수 선언문 시작

② 가변길이 문자열 형태로 30byte까지 저장할 수 있는 l_schema 변수를 생성하고 여기에 SYSTEM 이라는 문자열을 대입시킨다.

③ 프로그램 코드 시작

④ ~ ⑥ DBMS_JAVA 패키지를 통해 l_schema에 저장한 user에게 권한을 부여해준다.

⑦ PL/SQL 종료

⑧ 맨 끝의 '/' 는 SQL*Plus에게 PL/SQL 코드의 입력이 끝났음을 알리고 이를 Oracle 데이터베이스로 보내는 역할


 * VARCHAR2는 VARCHAR2(30 BYTE), VARCHAR2(30 CHAR) 처럼 BYTE 기준과 CHAR 기준으로 생성이 가능하고 위 예시와 같이 따로 선언하지 않을 경우 byte 형태로 생성된다.


* VARCHAR 와 VARCHAR2의 차이

 - 현재 VARCHAR와 VARCHAR2는 둘다 가변길이 문자열 형태로 사용된다. 하지만 추후 VARCHAR는 다른 형태로 사용될 것이라는 ORACLE의 발표가 있으므로 VARCHAR2를 사용하도록 권장하고 있다.


“Do not use the VARCHAR datatype. Use the VARCHAR2 datatype instead.

Although the VARCHAR datatype is currently synonymous with VARCHAR2,

the VARCHAR datatype is scheduled to be redefined as a separate

datatype used for variable-length character strings compared with

different comparison semantics.”


3. DBMS_JAVA

 - 권한을 부여할 때 사용된 DBMS_JAVA 패키지에 대해 알아보자.


3.1. DBMS_JAVA란?

 - DBMS_JAVA는 데이터베이스에서 사용하는 JAVA 객체에 접근하기 위한 함수를 제공하는 패키지이다.


3.2. DBMS_JAVA.grant_permission

 - 이 메소드는 특정 사용자나 role에 permission을 부여하기 위해 사용된다.

PROCEDURE grant_permission(grantee VARCHAR2, permission_type VARCHAR2, permission_name VARCHAR2, permission_action VARCHAR2)

위의 옵션을 참고하여 위에 작성한 권한 부여 PL/SQL 코드를 분석해보자.


④ l_schema에 할당된 유저(SYSTEM)에게 java.io.FilePermission 타입의 read ,write, execute, delete 역할을 수행하는 <<ALL FILES>> 이름의 permission을 부여

⑤ l_schema에 할당된 유저(SYSTEM)에게 SYS:java.lang.RuntimePermission 타입의 역할을 수행하는 writeFileDescriptor 이름의 permission을 부여

⑥ l_schema에 할당된 유저(SYSTEM)에게 SYS:java.lang.RuntimePermission 타입의 역할을 수행하는 readFileDescriptor 이름의 permission을 부여


* 참고

DBMS_JAVA Package : https://docs.oracle.com/cd/B28359_01/java.111/b31225/appendixa.htm

PL/SQL : http://jhbench.tistory.com/294

DBMS_JAVA : https://technet.tmaxsoft.com/upload/download/online/tibero/pver-20150504-000001/tibero_pkg/chap_dbms_java.html

반응형