a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 319|回复: 1

[考试辅导] oracle认证应用技术学习资料汇总21

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
三 Oracle Web Hacking 基本思路 ) b, Y  _5 k6 Z5 a3 T) c% H
  下面说说如何确定目标,注射参数的确定就由大家自己来了,主要是如何判断数据库属于oracle,根据数据库的特性很容易判断出来,oracle支持--类型注释,但是不支持; 分隔执行多语句,oracle有很多系统表,譬如all_tables,通过对这些表的访问也可以判断出是否属于oracle,另外在oracle里的一些函数也可以用来判断,譬如utl_http.request这些,语言上的小细节也可以用来区分系统,譬如在oracle里||是连接符号,但是在其他数据库里就不是了,所以 and chr(123)||chr(123)=chr(123)||chr(123)这样的,如果可以顺利执行,那么就基本应该是oracle了,另外,一些脚本在出现数据库查询错误时,对错误信息没有处理,也会泄露真实的后台数据库,这个可以很明显地看出来。
, X& m5 u# l, n1 o, ^2 q8 J) `' |4 y" q2 U  w
  然后需要确定的是注射点的类型,一般的情况下,我们进入的参数不是数字类型就基本是字符类型(其他很多人所说的搜索型注射其实还是应该归结于字符类型的),对于数字类型的基本不用考虑什么,很容易添加--注释字符就可以让语句正确闭合了,如果是字符类型的就要考虑如何让整个语句正确,通常是添加 ’以及--这些注射字符来构造自己的注射环境。在一些复杂的情况下,如同一个参数在多个sql语句和逻辑里出现,就要自己小心构造出符合环境的注射语句了,记住,我们只需要一个能便利插入自己sql命令的完好环境。
+ m$ O. Z& m! _# G1 ~* r' j8 E8 I; y
  在确定目标数据库为Oracle并且可以注射的时候,就可以开始尝试构造语句了。一般首先要进行的是判断当前的权限,在Oracle数据库里权限比较高的是DBA权限,拥有Oracle数据库的所有权限,另外如果当前用户的权限授予不对的话,也可以实现跨库查询的效果,可以通过对 dba_tables这样的dba的表进行尝试访问来测试是否是dba。在一般的注射中,分为select类型注射,insert类型注射以及update类型等。update和insert类型的注射可以根据上下文来更改数据库中的数据,如利用update注射将表中某个重要字段更改成我们想要的值,即使这些数据库无关紧要也没关系,我们可以利用select子语句来将我们需要的数据查询出来然后在另外某个地方将这个数据读出来,只要遵循数据库的语法,实现自己的目的就可以了。在这里主要说下select类型的注射,如果我们能控制select语句的一部分的话,就可能实现这种类型注射,如果查询的结果可以返回到页面中的时候,还可以尝试使用union查询出结果,直接将内容显示在页面当中,这是最方便的一种。事实上后面可以看到,无论是什么注射,在oracle的web环境下,都可以直接执行系统命令返回 shell。
- l: z: w( d6 t! `' S. j; D  e
3 e( @+ l- q) F+ c# }' _% h& Y  Oracle中获得敏感数据,首先就是oracle有系统表,任何有权限获得数据都可以从这里获得,关键的系统表有 all_tables,all_objects等,都是有权限能访问的,包括别人赋予你权限的,所以如果你的权限是dba的话,这能看到系统中所有的表,注射中一个技巧就是如果你需要从后台登陆但是不知道密码就可以在这里使用了,譬如猜测列名含不含有password等方法,后面的例子中也有讲述。
, x2 o; x0 m4 s8 Z. v9 w+ Z: h! B  {/ T+ u. p; |. m- R* U+ X
  另外比较需要了解的就是union查询,在oracle union查询中和其他数据库类似,要求列数一样,还要求类型完全一致,oracle类型有很多,常见的有字符类型,数字类型以及日期类型等等,一般我们能用来做union查询并且显示的是字符类型,所以需要精确定位哪个字段符合我们的要求(1 会在页面显示,数据从进入到出来会有很多的流程,很多数据会在中间经过多次的处理,所以要想找到能显示出来的数据,很多时候并不是那么顺利,这种显示包括很多地方,包括返回的http头,页面正文甚至是cookie等。 2 字符类型因为我们出来的数据大部分都是字符类型,所以需要这个类型用来正确地匹配 3长度需要足够尽管我们可以用一些字符函数来解决这个问题,但是够长的字段总是非常简便 ),oracle并不会自己做数据类型转换,但是oracle中提供了一个NULL类型,可以匹配所有的数据类型,所以我们在定位完字段数之后就可以在 union的各个字段填写null来匹配,另外oracle不支持select 1这样的查询,语法要求select必须有关键字,如果我们没有表可以用,可以用系统中默认谁都有权限的表dual。关于定位字段数其实也比较简单,和其他数据库一样可以利用order by 1-- 这样操作,如果字段个数存在就会正常,通常页面的逻辑会让这个参数不只在一个地方出现,所以order by地方不一致,所以不能进行union查询。在这里可能会遇到目标语言不支持’’的情况,所以可以使用chr这些函数来处理这些问题。
9 N; }! L( j' q$ A! A- L: k% G1 |, ?: H4 X; B
  即使不支持union,oracle的一些特性还是让我们轻易拿到想要的信息,就是用系统的utl_http.request包,这个包你可以看做是一个普通的函数,用来取得远方web服务器的请求信息,所以我们完全可以自己监听端口,然后通过这个函数用请求将需要的数据发送过来,这个时候我们还可以用来查看数据库可不可以上网以及出口IP,是个非常重要的一点。正是有了这些系统里丰富的包和函数以及存储过程,使得只要有一个注射点,就可以在oracle里做任何事情,包括权限允许的和权限不允许的,记住,是任何事。
回复

使用道具 举报

 楼主| 发表于 2012-8-4 14:06:20 | 显示全部楼层

oracle认证应用技术学习资料汇总21

  敏感数据只是我们想要的一部分,通常直接杀入oracle可能更有吸引力,这个时候查看系统的信息就非常地有价值了,对注射的灵活运用也非常重要。oracle在启动之后,把系统要用的一些变量都放置到一些特定的视图当中,可以利用这些视图获得想要的东西。
0 K  G5 g, T3 l/ `: k6 ?  4 @" T! Q/ N0 A# E" `3 @4 }: s
1 当前用户权限 (select * from session_roles)
' }0 e5 ~0 c% d" D# T2 v  2 当前数据库版本 (select banner from sys.v_$version where rownum=1) $ F- ~( s. {% S/ J
  3 服务器出口IP (用utl_http.request可以实现) & L' q8 _. j! M' E  P
  4 服务器监听IP (select utl_inaddr.get_host_address from dual) 8 Z9 ~, V; O4 \* x; x# y
  5 服务器操作系统 (select member from v$logfile where rownum=1) + M, H) y$ T) k( @1 H! J1 c
  6 服务器sid (远程连接的话需要,select instance_name from v$instance; ) " l* G. D8 ]9 G0 p
  7 当前连接用户 (select SYS_CONTEXT (’USERENV’, ’CURRENT_USER’) from dual)
: T" ]) ]. N" L2 S7 q$ F$ w4 z, c- X" c, {# ?  Q) U$ n
  知道上面这些之后就可以大致清楚服务器是在外网还是内网,支不支持远程连接,如果支持远程连接就可以尝试用默认的密码和刚得到的sid登陆了,在获得本地的权限之后,就可以尝试利用众多的包里面存在的注射提升权限了,在http://www.milw0rm.com/搜索oracle关键字可以找到很多这样的漏洞。 3 X! m, S9 h3 D' ~5 q
  x' r" ^& ~) N7 B/ D
  如果是远程并且不允许连接的的话,我们还是可以利用包的sql注射的,我上面说可以做任何事的,可以利用一个注射点轻易获得shell。上面说到在oracle里的包注射分好几种,这里需要的就是pl/sql块的注射,这个注射允许直接执行多语句,所以我们可以在web注射里利用这个直接以 sys的身份执行多条语句,如添加用户,创建自己的存储过程等等,几乎没有限制。但是系统的这种注射也是非常地少见,在06年被人公布过一个,也就是 SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES,具体的漏洞可以不了解,我也没有找到细节,后面有我做的一些简单黑盒分析,对于我们也只需要知道这是系统里存在的一个存储过程的pl/sql注射,可以导致执行多语句就可以了,而且oracle的补丁机制还不是很完善,基本上不会有管理员去patching这些,所以在我们看来就把这当作是系统提供的执行多语句的一个Hacking接口好了。如果你遇到一个sql注射本身就是在pl/sql里的话没,那么更要恭喜你了。 1 R" _6 V9 l7 m1 a. G/ l

5 O2 N$ s% q. }$ d  通过上面的几步基本让你可以获得你想要的东西,并且可以得到一个可以执行多语句的环境。在多语句执行的环境里,就可以利用oracle本身强大的功能,如支持java创建外部存储过程,支持utl_file包写文件等等,很方便地利用java写一个shell或者直接利用java包返回一个系统的shell。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-4-25 23:17 , Processed in 0.227444 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表