敏感数据只是我们想要的一部分,通常直接杀入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。 |