敏感数据只是我们想要的一部分,通常直接杀入oracle可能更有吸引力,这个时候查看系统的信息就非常地有价值了,对注射的灵活运用也非常重要。oracle在启动之后,把系统要用的一些变量都放置到一些特定的视图当中,可以利用这些视图获得想要的东西。 5 x7 l3 G+ L$ w
' b( [& `2 R# S6 k! l( R1 当前用户权限 (select * from session_roles) * D: z, Q% R' G8 j2 W
2 当前数据库版本 (select banner from sys.v_$version where rownum=1)
9 Q3 l' X+ j2 {# x; k 3 服务器出口IP (用utl_http.request可以实现)
" A; N$ o- ]+ ]5 G# u& m 4 服务器监听IP (select utl_inaddr.get_host_address from dual) ! \6 I# k1 G V/ S9 Q
5 服务器操作系统 (select member from v$logfile where rownum=1)
! u/ a j! _- E! F) d) x$ V, I0 h 6 服务器sid (远程连接的话需要,select instance_name from v$instance; )
' {+ t$ O6 \- ?- w 7 当前连接用户 (select SYS_CONTEXT (’USERENV’, ’CURRENT_USER’) from dual)
5 p& i) u$ B1 F4 W; n0 J, j) f I$ y9 Z! c& ?6 p" S! n
知道上面这些之后就可以大致清楚服务器是在外网还是内网,支不支持远程连接,如果支持远程连接就可以尝试用默认的密码和刚得到的sid登陆了,在获得本地的权限之后,就可以尝试利用众多的包里面存在的注射提升权限了,在http://www.milw0rm.com/搜索oracle关键字可以找到很多这样的漏洞。 m* g3 t" T* y. Z2 k* N d
6 f& a4 u- o; g& g; f 如果是远程并且不允许连接的的话,我们还是可以利用包的sql注射的,我上面说可以做任何事的,可以利用一个注射点轻易获得shell。上面说到在oracle里的包注射分好几种,这里需要的就是pl/sql块的注射,这个注射允许直接执行多语句,所以我们可以在web注射里利用这个直接以 sys的身份执行多条语句,如添加用户,创建自己的存储过程等等,几乎没有限制。但是系统的这种注射也是非常地少见,在06年被人公布过一个,也就是 SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES,具体的漏洞可以不了解,我也没有找到细节,后面有我做的一些简单黑盒分析,对于我们也只需要知道这是系统里存在的一个存储过程的pl/sql注射,可以导致执行多语句就可以了,而且oracle的补丁机制还不是很完善,基本上不会有管理员去patching这些,所以在我们看来就把这当作是系统提供的执行多语句的一个Hacking接口好了。如果你遇到一个sql注射本身就是在pl/sql里的话没,那么更要恭喜你了。
6 o" \/ j; `3 i' N7 s
# D3 ~3 J' z1 X 通过上面的几步基本让你可以获得你想要的东西,并且可以得到一个可以执行多语句的环境。在多语句执行的环境里,就可以利用oracle本身强大的功能,如支持java创建外部存储过程,支持utl_file包写文件等等,很方便地利用java写一个shell或者直接利用java包返回一个系统的shell。 |