Динамически создать ю-зверя

Звонок в техподдержку
Дата: 25.11.2009 22:51:46
Пишу скрипт по созданию тестовых ю-зверят в базе. Запускаю процедуру в которой вызывается

create user porndb_test0001 identified by test0001;

Хотелось бы узнать какими правами должен обладать хозяин процедуры?

Сейчас он имеет вот это
grant create user to test_maker with admin option;
grant alter user to test_maker with admin option;
Звонок в техподдержку
Дата: 25.11.2009 22:54:27
Забыл добавить, в процедуре выглядит это так:

sqlka:= 'create user ' || login || ' identified by ' || pass1;
dbms_output.put_line(sqlka);
execute immediate sqlka;
andrey_anonymous
Дата: 25.11.2009 22:55:56
create session не помешала бы :)

что конкретно не получается? И что, собственно, делаете?
Звонок в техподдержку
Дата: 25.11.2009 23:02:08
andrey_anonymous
create session не помешала бы :)

что конкретно не получается? И что, собственно, делаете?


Ананимус, сделал процедуру которая вызывает динамический sql по созданию ю-зверя. При запуске начинает ругать на то что не хватает привелегий
andrey_anonymous
Дата: 26.11.2009 00:04:17
Звонок в техподдержку, недоброе дело Вы затеяли. Одних только sql injection должно быть достаточно для вразумления.
conn / as sysdba
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 
Connected as SYS
create user ane_testadmin identified by pass
default tablespace users
temporary tablespace temp
quota unlimited on users
account unlock;
 
User created

grant create procedure to ane_testadmin;
 
Grant succeeded

grant create session to ane_testadmin with admin option;
 
Grant succeeded

grant create user to ane_testadmin;
 
Grant succeeded

grant alter user to ane_testadmin;
 
Grant succeeded

connect ane_testadmin/pass@mydb
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 
Connected as ane_testadmin

create or replace procedure useradd(username varchar2, pwd varchar2) is
  stmnt varchar2(2000);
begin
  stmnt := 'create user '||username||' identified by '||pwd||' account unlock';
  execute immediate stmnt;
  stmnt := 'grant create session to '||username;
  execute immediate stmnt;
end useradd;
/
 
Procedure created

exec useradd('ane_testu1','passu1');
 
PL/SQL procedure successfully completed

connect ane_testu1/passu1@mydb

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 
Connected as ane_testu1
 
SQL> 
_Alex_SMIRNOV_
Дата: 26.11.2009 00:24:43
С sql injection можно пробовать бороться при помощи DBMS_ASSERT.
А еще бы я вам порекомендовал следующее... поосторожнее с раздачей прав alter user или drop user это гораздо опаснее чем create user... Заблокируйте пользователя с подобными правами и используйте только процедуру через гранты, и то это не всегда безопасно...
Ashok Mishra
Дата: 26.11.2009 01:55:34
andrey_anonymous,

когда-то давным-давно было похожее решение...
но что-то я особо не вижу sql injection...
наше счастье, что execute immediate не выолняет только один стейтмент...
Ashok Mishra
Дата: 26.11.2009 01:56:25
Ashok Mishra
andrey_anonymous,

когда-то давным-давно было похожее решение...
но что-то я особо не вижу sql injection...
наше счастье, что execute immediate не выолняет только один стейтмент...

упс
Ashok Mishra
Дата: 26.11.2009 02:13:11
andrey_anonymous,

Если неохота бросать инжешн на всех, можно бромить на адрес: mishok.ashra@gmail.com
andrey_anonymous
Дата: 26.11.2009 02:15:39
Ashok Mishra, в приведенном примере качестве можно передать все что позволяет сказать create user - от квот на табличные пространства до желаемого профиля.
Предположим, что useradd должен создавать юзверей идентифицируемыми внешним каталогом с предопределенным профилем и в тексте это отрежено так:
execute immediate 'create user '||username||' identified externally as ''....'' <predefined profile clause> account lock';
А добрый злодей зовет ее так:
exec useradd('ME identified by... <my profile> <my quota> account unlock --','фигвам');
и получает нелимитированного юзера, авторизуемого паролем.
Реальный же код может оказаться заметно сложнее - ведь надо и гранты раздать, и конфликты потенциальные разрешить, и т.п. - возможностей для injection станет еще больше.